Bagaimana mengkonversi ADO.NET DataSet objek ke objek ADO Recordset dalam Visual Basic.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 316337 - Melihat produk di mana artikel ini berlaku.
Perhatian ADO dan ADO MD tak sepenuhnya diuji di Microsoft.NET Framework lingkungan. Mereka dapat menyebabkan masalah berselang, terutama dalam aplikasi berbasis layanan atau aplikasi multithreaded. Teknik yang dibahas dalam artikel ini hanya boleh digunakan sebagai ukuran sementara selama migrasi ke ADO.NET. Anda hanya harus menggunakan teknik-teknik ini setelah Anda telah melakukan lengkap pengujian untuk memastikan bahwa ada tidak ada masalah kompatibilitas. Masalah yang disebabkan oleh menggunakan ADO atau ADO MD dengan cara ini tidak didukung. Untuk informasi lebih lanjut, lihat artikel berikut pada Basis Pengetahuan Microsoft:
840667 Anda menerima kesalahan tak terduga ketika menggunakan ADO dan ADO MD dalam.NET Framework aplikasi
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini selangkah demi selangkah menjelaskan bagaimana mengkonversi ADO.NET DataSet objek untuk ActiveX Data objek (ADO) Recordset objek.

Artikel ini menggunakan pendekatan XML untuk mengkonversi The DataSet untuk seorang ADO Recordset. Format XML yang berlangsung di ADO berbeda dari XML format DataSet. Oleh karena itu, Anda dapat menyederhanakan proses konversi jika Anda mengkonversi dari satu format XML ke yang lain. ADO bertahan penyedia memfasilitasi memuat berkas .xml ke ADO Recordset, selama itu adalah dalam format ADO XML.


Catatan Ketika Anda menggunakan metode ini, Anda hanya dapat membuat ADODB hanya-baca Recordset. Untuk membuat diupdate Recordset, membuat kosong terhubung Recordset, kemudian masukkan semua baris.


Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, dan paket layanan yang diperlukan:
  • Microsoft Windows XP, Windows 2000, atau Windows NT 4.0 Paket Layanan 6a
  • Microsoft Data akses komponen (MDAC) 2.6 atau kemudian
  • Microsoft Visual Studio.NET
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan berikut topik:
  • Microsoft Visual Basic.Sintaks bersih
  • ADO.NET dan versi sebelumnya ADO
  • DataSet dan ADO Recordset Format XML

Buat XSLT File

  1. Pada Notepad, menyalin dan kemudian paste kode XSLT berikut:
    <?xml version="1.0"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="tablename"/>
    <xsl:template match="NewDataSet">
    <rs:data>
    	<xsl:for-each select="./node()[local-name(.)=$tablename]">
    		<z:row>
    			<xsl:for-each select="@*">
    				<xsl:copy-of select="."/>
    			</xsl:for-each>
    		</z:row>
    	</xsl:for-each>
    </rs:data>
    </xsl:template>
    </xsl:stylesheet>
    					
  2. Simpan berkas sebagaiTest.XSL.

Menciptakan Visual Basic.NET DLL

  1. Mulai Visual Studio.NET.
  2. Pada Berkas menu, titik Baru, lalu klik Project.
  3. Klik Proyek-proyek Visual Basic di bawah Jenis proyek, lalu klik Perpustakaan kelas di bawah Pola acu.
  4. Jenis ConvertDStoRS dalam Nama: kotak, dan kemudian klik Oke.
  5. Dalam Class1.vb, mengganti kode yang ada dengan berikut kode:
    Imports System.Data
    Imports System.Xml
    Imports System.Xml.XPath
    Imports System.Xml.Xsl
    Imports System.IO
    
    '**************************************************************************
    '   Class Name  : ConvertToRs
    '   Description : This class converts a DataSet to a ADODB Recordset.
    '**************************************************************************
    Public Class ConvertToRs
    
      '**************************************************************************
      '   Method Name : GetADORS
      '   Description : Takes a DataSet and converts into a Recordset. The converted 
      '                 ADODB recordset is saved as an XML file. The data is saved 
      '                 to the file path passed as parameter.
      '   Output      : The output of this method is long. Returns 1 if successfull. 
      '                 If not throws an exception. 
      '   Input parameters:
      '               1. DataSet object
      '               2. Database Name
      '               3. Output file - where the converted should be written.
      '**************************************************************************
      Public Function GetADORS(ByVal ds As DataSet, ByVal dbname As String, ByVal xslfile As String, _
        ByVal outputfile As String) As Long
    
        'Create an xmlwriter object, to write the ADO Recordset Format XML
        Try
          Dim xwriter As New XmlTextWriter(outputfile, System.Text.Encoding.Default)
    
          'call this Sub to write the ADONamespaces to the XMLTextWriter
          WriteADONamespaces(xwriter)
          'call this Sub to write the ADO Recordset Schema
          WriteSchemaElement(ds, dbname, xwriter)
    
          Dim TransformedDatastrm As New MemoryStream
          'Call this Function to transform the Dataset xml to ADO Recordset XML
          TransformedDatastrm = TransformData(ds, xslfile)
          'Pass the Transformed ADO REcordset XML to this Sub
          'to write in correct format.
          HackADOXML(xwriter, TransformedDatastrm)
    
          xwriter.Flush()
          xwriter.Close()
          'returns 1 if success
          Return 1
    
        Catch ex As Exception
          'Returns error message to the calling function.
          Err.Raise(100, ex.Source, ex.ToString)
        End Try
    
      End Function
    
    
      Private Sub WriteADONamespaces(ByRef writer As XmlTextWriter)
        'The following is to specify the encoding of the xml file
        'writer.WriteProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'")
    
        'The following is the ado recordset format
        '<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' 
        '        xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
        '        xmlns:rs='urn:schemas-microsoft-com:rowset' 
        '        xmlns:z='#RowsetSchema'>
        '    </xml>
    
        'Write the root element
        writer.WriteStartElement("", "xml", "")
    
        'Append the ADO Recordset namespaces
        writer.WriteAttributeString("xmlns", "s", Nothing, "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882")
        writer.WriteAttributeString("xmlns", "dt", Nothing, "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882")
        writer.WriteAttributeString("xmlns", "rs", Nothing, "urn:schemas-microsoft-com:rowset")
        writer.WriteAttributeString("xmlns", "z", Nothing, "#RowsetSchema")
        writer.Flush()
    
      End Sub
    
    
      Private Sub WriteSchemaElement(ByVal ds As DataSet, ByVal dbname As String, ByRef writer As XmlTextWriter)
        'ADO Recordset format for defining the schema
        ' <s:Schema id='RowsetSchema'>
        '            <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
        '            </s:ElementType>
        '        </s:Schema>
    
        'write element schema
        writer.WriteStartElement("s", "Schema", "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882")
        writer.WriteAttributeString("id", "RowsetSchema")
    
        'write element ElementTyoe
        writer.WriteStartElement("s", "ElementType", "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882")
    
        'write the attributes for ElementType
        writer.WriteAttributeString("name", "", "row")
        writer.WriteAttributeString("content", "", "eltOnly")
        writer.WriteAttributeString("rs", "updatable", "urn:schemas-microsoft-com:rowset", "true")
    
        WriteSchema(ds, dbname, writer)
        'write the end element for ElementType
        writer.WriteFullEndElement()
    
        'write the end element for Schema 
        writer.WriteFullEndElement()
        writer.Flush()
      End Sub
    
    
      Private Sub WriteSchema(ByVal ds As DataSet, ByVal dbname As String, ByRef writer As XmlTextWriter)
    
        Dim i As Int32 = 1
        Dim dc As DataColumn
    
        For Each dc In ds.Tables(0).Columns
    
          dc.ColumnMapping = MappingType.Attribute
    
          writer.WriteStartElement("s", "AttributeType", "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882")
          'write all the attributes 
          writer.WriteAttributeString("name", "", dc.ToString)
          writer.WriteAttributeString("rs", "number", "urn:schemas-microsoft-com:rowset", i.ToString)
          writer.WriteAttributeString("rs", "baseCatalog", "urn:schemas-microsoft-com:rowset", dbname)
          writer.WriteAttributeString("rs", "baseTable", "urn:schemas-microsoft-com:rowset", _
                dc.Table.TableName.ToString)
          writer.WriteAttributeString("rs", "keycolumn", "urn:schemas-microsoft-com:rowset", _
                dc.Unique.ToString)
          writer.WriteAttributeString("rs", "autoincrement", "urn:schemas-microsoft-com:rowset", _
                dc.AutoIncrement.ToString)
          'write child element
          writer.WriteStartElement("s", "datatype", "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882")
          'write attributes
          writer.WriteAttributeString("dt", "type", "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882", _
                GetDatatype(dc.DataType.ToString))
          writer.WriteAttributeString("dt", "maxlength", "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882", _
                dc.MaxLength.ToString)
          writer.WriteAttributeString("rs", "maybenull", "urn:schemas-microsoft-com:rowset", _
                dc.AllowDBNull.ToString)
          'write end element for datatype
          writer.WriteEndElement()
          'end element for AttributeType
          writer.WriteEndElement()
          writer.Flush()
          i = i + 1
        Next
        dc = Nothing
    
      End Sub
    
    
      'Function to get the ADO compatible datatype
      Private Function GetDatatype(ByVal dtype As String) As String
        Select Case (dtype)
          Case "System.Int32"
            Return "int"
          Case "System.DateTime"
            Return "dateTime"
        End Select
      End Function
    
    
      'Transform the data set format to ADO Recordset format
      'This only transforms the data
      Private Function TransformData(ByVal ds As DataSet, ByVal xslfile As String) As MemoryStream
    
        Dim instream As New MemoryStream
        Dim outstream As New MemoryStream
    
        'write the xml into a memorystream
        ds.WriteXml(instream, XmlWriteMode.IgnoreSchema)
        instream.Position = 0
    
        'load the xsl document
        Dim xslt As New XslTransform
        xslt.Load(xslfile)
    
        'create the xmltextreader using the memory stream
        Dim xmltr As New XmlTextReader(instream)
        'create the xpathdoc
        Dim xpathdoc As XPathDocument = New XPathDocument(xmltr)
    
        'create XpathNavigator
        Dim nav As XPathNavigator
        nav = xpathdoc.CreateNavigator
    
        'Create the XsltArgumentList.
        Dim xslArg As XsltArgumentList = New XsltArgumentList
    
        'Create a parameter that represents the current date and time.
        Dim tablename As String
        xslArg.AddParam("tablename", "", ds.Tables(0).TableName)
    
        'transform the xml to a memory stream
        xslt.Transform(nav, xslArg, outstream)
    
        instream = Nothing
        xslt = Nothing
        '        xmltr = Nothing
        xpathdoc = Nothing
        nav = Nothing
    
        Return outstream
    
      End Function
    
    
      '**************************************************************************
      '   Method Name : ConvertToRs
      '   Description : The XSLT does not tranform with fullendelements. For example, 
      '               <root attr=""/> intead of <root attr=""><root/>. ADO Recordset 
      '               cannot read this. This method is used to convert the 
      '               elements to have fullendelements.
      '**************************************************************************
      Private Sub HackADOXML(ByRef wrt As XmlTextWriter, ByVal ADOXmlStream As System.IO.MemoryStream)
    
        ADOXmlStream.Position = 0
        Dim rdr As New XmlTextReader(ADOXmlStream)
        Dim outStream As New MemoryStream
        'Dim wrt As New XmlTextWriter(outStream, System.Text.Encoding.Default)
    
        rdr.MoveToContent()
        'if the ReadState is not EndofFile, read the XmlTextReader for nodes.
        Do While rdr.ReadState <> ReadState.EndOfFile
          If rdr.Name = "s:Schema" Then
            wrt.WriteNode(rdr, False)
            wrt.Flush()
          ElseIf rdr.Name = "z:row" And rdr.NodeType = XmlNodeType.Element Then
            wrt.WriteStartElement("z", "row", "#RowsetSchema")
            rdr.MoveToFirstAttribute()
            wrt.WriteAttributes(rdr, False)
            wrt.Flush()
          ElseIf rdr.Name = "z:row" And rdr.NodeType = XmlNodeType.EndElement Then
            'The following is the key statement that closes the z:row 
            'element without generating a full end element
            wrt.WriteEndElement()
            wrt.Flush()
          ElseIf rdr.Name = "rs:data" And rdr.NodeType = XmlNodeType.Element Then
            wrt.WriteStartElement("rs", "data", "urn:schemas-microsoft-com:rowset")
          ElseIf rdr.Name = "rs:data" And rdr.NodeType = XmlNodeType.EndElement Then
            wrt.WriteEndElement()
            wrt.Flush()
          End If
          rdr.Read()
        Loop
    
        wrt.WriteEndElement()
        wrt.Flush()
      End Sub
    
    End Class
    
    
  6. Pada Bangun menu, klik Membangun solusi. ConvertDStoRS.dll Visual Basic.NET DLL dibuat.

Menciptakan Visual Basic.NET proyek

  1. Untuk membuat baru Visual Basic.Aplikasi NET konsol, Ikuti langkah berikut:
    1. Mulai Visual Studio.NET.
    2. Pada Berkas menu, titik Baru, lalu klik Project.
    3. Klik Proyek-proyek Visual Basic di bawah Jenis proyek, lalu klik Aplikasi konsol di bawah Pola acu.
  2. Untuk menambahkan referensi ke ConvertDStoRS.dll dan ActiveX Data Objek (ADO) perpustakaan, ikuti langkah berikut:
    1. Pada Project menu, klik Menambahkan referensi.
    2. Dalam Menambahkan referensi dialog kotak, pada .NET tab, klik People, dan kemudian cari file ConvertDStoRS.dll yang Anda buat di langkah 6 dari Menciptakan Visual Basic.NET DLL ayat dari artikel ini.
    3. Klik ConvertDStoRS.dll, klik Pilih, lalu klik Oke.
    4. Dalam Menambahkan referensi kotak dialog, klik COM tab.
    5. Klik Perpustakaan objek Microsoft ActiveX Data 2.6 (atau versi yang lebih baru) di Nama komponen Daftar, klik Pilih, lalu klik Oke.
  3. Dalam Module1.vb, mengganti kode yang ada dengan berikut kode:
    Imports System.Data
    Imports System.Data.SqlClient
    Module Module1
    
        Sub Main()
    
            Dim cnNwind As New SqlConnection("data source=mySQLServer;Integrated Security=SSPI;initial catalog=pubs;")
            Dim daAuthors As New SqlDataAdapter("Select * from Authors", cnNwind)
            Dim ds As New DataSet()
            Try
                daAuthors.Fill(ds, "Authors")
                daAuthors.FillSchema(ds.Tables("Authors"), SchemaType.Source)
    
                Dim objconvert As New ConvertDStoRS.ConvertToRs()
                Dim result As Long
                result = objconvert.GetADORS(ds, "Northwind", "c:\temp\test.xsl", "c:\temp\result.xml")
                If result = 1 Then
    
                    Dim rs As New ADODB.Recordset()
                    rs.Open("c:\temp\result.xml")
                    Console.WriteLine("RecordCount =" & str(rs.RecordCount))
                    Console.Read()
                End If
    
            Catch sqlex As SqlException
                Console.WriteLine(sqlex.Message)
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
           
        End Sub
    
    End Module
    					
  4. Membangun dan kemudian menjalankan proyek. Perhatikan bahwa catatan Count akan ditampilkan di jendela konsol.
Catatan Untuk menangani karakter khusus dalam data, menulis pengolahan instruksi dengan atribut encoding. Anda dapat membuat perubahan ini dalam ConvertToRs kelas yang disebutkan di dalam berkas class1.vb "menciptakan Visual Basic.NET DLL"bagian dari artikel ini atau dalam berkas result.xml. Perhatikan bahwa pemrosesan instruksi hanya memberitahu format encoding ke parser, dan data harus dalam format encoding tertentu. Misalnya:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml version="1.0" encoding="UTF-8"?> 
Anda dapat mengontrol penyandian data dalam.NET beberapa cara. Untuk contoh: XmlTextWriter konstruktor dapat digunakan.
Public Sub New(Stream, Encoding)

REFERENSI

Untuk informasi tambahan, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
308064 Bagaimana untuk bertahan ADO.NET DataSet sebagai XML dengan menggunakan Visual Basic.NET
301216 Cara mengisi DataSet objek dari Database dengan menggunakan Visual Basic.NET
313590 INFO: Peta jalan untuk ADO.NET
313649 INFO: Peta jalan untuk XML integrasi dengan ADO.NET

Properti

ID Artikel: 316337 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Kata kunci: 
kbdataadapter kbhowtomaster kbsqlclient kbsystemdata kbmt KB316337 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:316337

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com