Anda sedang offline saat ini, menunggu internet Anda untuk menyambung kembali

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

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
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
Artikel ini merujuk kepada berikut Microsoft.NET Framework kelas perpustakaan namespaces:
  • System.data
  • System.data.SqlClient

DALAM TUGAS 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.DataImports System.XmlImports System.Xml.XPathImports System.Xml.XslImports 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 SubEnd 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.DataImports System.Data.SqlClientModule 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 SubEnd 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

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Properti

ID Artikel: 316337 - Tinjauan Terakhir: 09/24/2011 14:23:00 - Revisi: 2.0

Microsoft ADO.NET 1.1, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbdataadapter kbhowtomaster kbsqlclient kbsystemdata kbmt KB316337 KbMtid
Tanggapan