很多情況需要跟其他廠商做資料交換

當然大家資料格式不會一樣

這時候想使用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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 longlang0616 的頭像
    longlang0616

    八咫烏的天空

    longlang0616 發表在 痞客邦 留言(0) 人氣()