增補透視一文:將ADO.NET或Webservice返回的DataSet轉換成ADODB.Recordset

來源:互聯網
上載者:User
ado|web|轉換 記得在《透視和調整你的企業和商務系統》一文中,我們討論了有關組件、SOAP、WebService的一些問題,特別對於這樣的一些問題:

如何產生一個構造一個簡單的三層結構(Window DNA)

如何將現有的組件暴露出來,成為一個WebService

如何使用MS SOAP Toolkit來產生Client消費WebService

如何在dotNET中調用SOAP Toolkit產生的WebService

如何處理和傳輸ADODB.Recordset類型的資料,實現自己的CTM。

如何將目前的組件用ASP.NET封裝成WebService

進行了一些討論和實驗,在討論到用ASP.NET封裝我們的組件成WebService,然後使用MS SOAP Toolkit消費WebService時,我曾跳過了一個問題,那就是如何接收WebService傳輸過來的成組資料。



記得代碼是這樣的:

Dim RetXML as Object

Dim SoapClient As MSSOAPLib.SoapClient

Set SoapClient = New MSSOAPLib.SoapClient



Call SoapClient.mssoapinit("http://Dereksvr/Authors/Authors.asmx?WSDL")



Set RetXML = SoapClient.GetAuthors()

GetAuthors()返回的是一個DataSet類型,在開始產生WebService時我們是這樣封裝的:

<WebMethod()> Public Function GetAuthors() As DataSet



Dim obj As bus_Authors.Authors

Dim rst As ADODB.Recordset



Dim myDataAdapter As OleDb.OleDbDataAdapter

Dim retDataset As DataSet



obj = New bus_Authors.Authors()

rst = New ADODB.Recordset()



myDataAdapter = New OleDb.OleDbDataAdapter()

retDataset = New DataSet()



rst = obj.GetAuthors()

myDataAdapter.Fill(retDataset, rst, "GetAuthors")

GetAuthors = retDataset

End Function

而對於VB來說RetXML將是不可以認識和直接使用的,好在Dataset是基於XML的,事實上它是有規律的,我們可以通過直接存取.asmx檔案(http://Dereksvr/Authors/Authors.asmx)來在網頁上調用這個WebService 的GetAuthors(),在IE中我們可以看到這個Dataset的結構,這樣我們就可以找出規律,來使用這個Dataset中的資料。










根據上面的情況我寫了一個函數可以將Dataset轉換成ADODB.Recordset

Public Function ConvDatasetToRecordset(ByVal voNL As IXMLDOMNodeList, ByVal vsTableName As String) As ADODB.Recordset



Dim iXMLTableNode As IXMLDOMNode

Dim iXMLRecordNode As IXMLDOMNode

Dim iXMLFieldNode As IXMLDOMNode

Dim iXMLNodeList As IXMLDOMNodeList



Dim retRS As ADODB.Recordset

Dim sXPath As String



On Error GoTo ErrHandle



' Create Recordset using the xsd schema

sXPath = "//xsd:element[@name=""" & vsTableName & """]/xsd:complexType/xsd:sequence"

Set iXMLTableNode = voNL.Item(1).selectSingleNode(sXPath)



Set retRS = New ADODB.Recordset



For Each iXMLFieldNode In iXMLTableNode.childNodes

If Not iXMLFieldNode.Attributes Is Nothing Then

Call retRS.Fields.Append(iXMLFieldNode.Attributes(0).Text, GetDataType(iXMLFieldNode.Attributes(1).Text), 512)

End If

Next



' Add the data to the Recordset

sXPath = "//" & vsTableName

Set iXMLNodeList = voNL.Item(3).selectNodes(sXPath)



Call retRS.Open



For Each iXMLRecordNode In iXMLNodeList

Call retRS.AddNew

For Each iXMLFieldNode In iXMLRecordNode.childNodes

If Len(iXMLFieldNode.baseName) > 0 Then

retRS.Fields(iXMLFieldNode.baseName) = iXMLFieldNode.Text

End If

Next

Next



If Not (retRS.BOF And retRS.EOF) Then Call retRS.MoveFirst

Set ConvDatasetToRecordset = retRS



ErrExit:

Exit Function



ErrHandle:

Set ConvDatasetToRecordset = Nothing

Resume ErrExit



End Function



Private Function GetDataType(ByVal vsType As String) As ADODB.DataTypeEnum

' Convert the XSD datatype to a ADO datatype

Select Case vsType

Case "xsd:string"

GetDataType = adVarChar

Case "xsd:int"

GetDataType = adInteger

Case "xsd:dateTime"

GetDataType = adDate

Case "xsd:decimal"

GetDataType = adDouble

Case "xsd:boolean"

GetDataType = adBoolean

End Select

End Function

對於GetDataType中的類型我沒有一一試過,只使用了常見的幾個,具體的可以參見下面的連結:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefsupporteddatatypeconversions.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdcstdatatypeenum.asp

繼續添加,以保證能夠符合你具體的需要。然後套用我們在第三篇中的表現層的函數顯示在一個Grid中:

Set RetXML = SoapClient.GetAuthors()

Set result = ConvDatasetToRecordset(RetXML, “GetAuthors”)

LvwHeadName lstAuthors, strHeaders

ADOFillLvw result, lstAuthors



想想挺有意思,開始是ADODB.Recordset類型的,然後在WebService中轉換成DataSet類型,然後又轉換成ADODB.Recordset。XML是一個強大的介質,而dotNET中對於Dataset比上一版的Recordset也將是一種突破。對於DataSet的應用也將是極其靈活和沒有限制的,因為它的核心和基礎是XML。




既然是增補,我也應要求將透視和調整一文中涉及到的例子的Project和代碼上傳到CSDN,另外一個是拷屏的圖片,希望兩者對於閱讀和理解會有少許協助,具體的安裝過程我就省略了。





相關檔案:

http://263.csdn.net/FileBBS/files/2001_10/T_724_1.zip(Code)

http://263.csdn.net/FileBBS/files/2001_10/T_724_2.zip(Jpg)




--------------------------------------------------------------------------------


特別:



以上文字和圖片涉及其他人的隱私和個人權利,如非被授權或經本人同意,任何網站或期刊請不要刊登、轉載、改編、轉貼或已其他形式進行傳播。以上所有文字和圖片只用於內部交流,不作任何新聞發表和商業用途。





相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。