很多情況需要跟其他廠商做資料交換
當然大家資料格式不會一樣
這時候想使用XML作資料交換
又只有使用SQL的select指令
也不想多費工使用SQL預存或是接接資料自己轉XML
就可以用偷懶方法,在SQL敘述後面加上
FOR XML auto, root('自己定義的根節點')
預設是把欄位資料變成屬性,如果需要輸出成Element
就直接在root前面加上element ,敘述
剩下的問題就是怎麼去接SQL給的XML了
一般使用 XmlReader就可以了
我還是習慣把常用的寫成function囉
要注意的是select出來有可能沒有資料,如果接的人直接設定node path沒做例外處理的話,可能會出錯
for xml敘述在沒有資料的情況下還是會回傳一個只有根節點的xml
有段是檢查有沒有子節點,我習慣在根節點上直接添加一個state屬性,直接告訴對方是true(有資料)還是false(沒資料)
這樣對方只需要先檢查根節點的state屬性就可以知道有沒有資料了,沒資料也就不必繼續往下讀取了
stateOKresult是加上節點state為true的function
resultExport是當沒有資料的時候,預設的XML回傳
這兩個function就不列出來了,請自行運用改寫吧
另外就是SqlConnection 不知道為什麼,只使用Dispose的時候
有時候會導致SQL pool關不乾淨,造成SQL連接滿的情況,但又不是每條SqlConnection 都會這樣
為求一勞永逸,我只好連close跟=nothing都一起用上了...
Public Shared Function xmlDBConnect(ByVal source As String, ByVal SqlTemp As String) As XmlDocument
Dim xmlDoc As New XmlDocument
Dim ConnTemp As SqlConnection = New SqlConnection(projectClass.DBString(0))
Dim rsXmlTemp As XmlReader
ConnTemp.Open()
Dim cmd As SqlCommand = New SqlCommand(SqlTemp & " FOR XML auto, root('根節點名稱') ", ConnTemp)
rsXmlTemp = cmd.ExecuteXmlReader
xmlDoc.Load(rsXmlTemp)
'此段程式請視情況修改
If xmlDoc.HasChildNodes Then
xmlDoc = stateOKresult(xmlDoc)
Else
xmlDoc.LoadXml(resultExport("False", "90001", "沒有符合查詢條件的資料"))
End If
cmd.Dispose()
rsXmlTemp.Close()
ConnTemp.Dispose()
ConnTemp.Close()
cmd = Nothing
rsXmlTemp = Nothing
ConnTemp = Nothing
Return xmlDoc
End Function