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

worldblog發表於2007-12-10
增補透視一文:將ADO.NET或Webservice返回的DataSet轉換成ADODB.Recordset (轉)[@more@]

增補透視一文:將或service返回的DataSet轉換成ADO.Recordset:namespace prefix = o ns = "urn:schemas--com::office" /> 


小氣的神 2001-10-23

記得在《透視和調整你的企業和商務》一文中,我們討論了有關、P、WebService的一些問題,特別對於這樣的一些問題:

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

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

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

如何在中SOAP Toolkit生成的WebService

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

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

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

 

記得程式碼是這樣的:

  Dim RetXML as

Dim SoapClient As MSSOAPLib.SoapClient

  Set SoapClient = New MSSOAPLib.SoapClient

  Call SoapClient.mssonit("")

Set RetXML = SoapClient.GetAuthors()

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

  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()來在網頁上呼叫這個WebService 的GetAuthors(),在IE中我們可以看到這個Dataset的結構,這樣我們就可以找出規律,來使用這個Dataset中的資料。

 

GetAuthra href=os XML Dataset" hspace=0 src="" align=baseline border=0>

 

 

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

Public Function ConvDatasetToRecordset(ByVal voNL As IXMLNodeList, 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 s 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).SingleNode(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中的型別我沒有一一試過,只使用了常見的幾個,具體的可以參見下面的連結:

繼續新增,以保證能夠符合你具體的需要。然後套用我們在第三篇中的表現層的函式顯示在一個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,另外一個是拷屏的圖片,希望兩者對於閱讀和理解會有少許幫助,具體的過程我就省略了。

 

 

相關檔案:

)

)


特別:

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

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990975/,如需轉載,請註明出處,否則將追究法律責任。

相關文章