增補透視一文:將 ADO.NET 或 Webservice返回 的 DataSet 轉換成 ADODB.Recordset 小氣的神 2001-10-23 記得在《透視和調整你的企業和商務系統》一文中," name="description" />

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 增補透視一文:將ADO.NET或Webservice返回的DataSet轉換成ADODB.Recordset

    發表于:2007-05-25來源:作者:點擊數: 標簽:WebService增補ADO.NET一文透視
    MI LY: 宋體; mso-ascii-font-family: 'Lucida Console'; mso-hansi-font-family: 'Lucida Console'">增補透視一文:將 ADO.NET 或 Webservice返回 的 DataSet 轉換成 ADODB.Recordset 小氣的神 2001-10-23 記得在《透視和調整你的企業和商務系統》一文中,

    MILY: 宋體; mso-ascii-font-family: 'Lucida Console'; mso-hansi-font-family: 'Lucida Console'">增補透視一文:將ADO.NETWebservice返回DataSet轉換成ADODB.Recordset 


    小氣的神 2001-10-23

     

    記得在《透視和調整你的企業和商務系統》一文中,我們討論了有關組件、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中的數據。

     

    GetAuthros XML 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 = "http://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 = "http://" & 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)


    特別:

     

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

     

     

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>