Como converter um objeto DataSet do ADO.NET para um objeto ADO Recordset no Visual Basic .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 316337
cuidado ADO e ADO MD não foram totalmente testados em um ambiente Microsoft .NET Framework. Eles podem causar problemas intermitentes, especialmente em aplicativos baseados em serviço ou em aplicativos multissegmentados. As técnicas descritos neste artigo só devem ser usadas como uma medida temporária durante a migração para o ADO.NET. Você só deve usar essas técnicas depois de ter conduzido teste completo para verificar não se estão nenhum problema de compatibilidade. Quaisquer problemas que são causados por usando ADO ou ADO MD dessa maneira não são suportados. Para obter mais informações, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
840667 Você receber erros inesperados ao usar o ADO e ADO MD em um aplicativo .NET Framework
Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.Data
  • System.Data.SqlClient

NESTA TAREFA

Sumário
Este artigo passo a passo descreve como converter um objeto do ADO.NET DataSet para um objeto Recordset do ActiveX Data Objects (ADO).

Este artigo usa a abordagem XML para converter o DataSet em um Recordset do ADO. O formato XML que é mantido no ADO difere o XML formato do DataSet . Portanto, você pode simplificar o processo de conversão se você converter de um formato XML para o outro. O provedor de persistência do ADO facilita para carregar o arquivo .XML para um ADO Recordset , desde que ele esteja no formato XML de ADO.


Observação Quando você usa esse método, você pode criar apenas um ADODB somente-leitura Recordset. Para criar um Recordset atualizável, crie um conectado vazia Recordset e insira todas as linhas.


Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs são necessários:
  • Microsoft Windows XP, Windows 2000 ou Windows NT 4.0 Service Pack 6a
  • Microsoft Data Access Components (MDAC) 2.6 ou posterior
  • Microsoft Visual Studio .NET
Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
  • Sintaxe do Microsoft Visual Basic .NET
  • ADO.NET e versões anteriores do ADO
  • formatos de DataSet e ADO Recordset XML

Criar um arquivo XSLT

  1. No bloco de notas, copie e cole o código XSLT a seguir:
    <?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. Salve o arquivo como Test.xsl .

Criar uma DLL de .NET Visual Basic

  1. Inicie o Visual Studio NET..
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Clique em Projetos do Visual Basic em Tipos de projeto e, em seguida, clique em Class Library em modelos .
  4. Digite ConvertDStoRS in a nome: caixa e, em seguida, clique em OK .
  5. Na Class1.vb, substitua o código existente com o seguinte código:
    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. No menu Build , clique em Build Solution . A DLL do ConvertDStoRS.dll Visual Basic .NET é criada.

Criar um projeto de .NET Visual Basic

  1. Para criar um novo aplicativo console Visual Basic .NET, siga estas etapas:
    1. Inicie o Visual Studio NET..
    2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
    3. Clique em Projetos do Visual Basic em Tipos de projeto e, em seguida, clique em Aplicativo de console em modelos .
  2. Para adicionar referências para ConvertDStoRS.dll e ActiveX Data Objects (ADO) biblioteca, execute estas etapas:
    1. No menu Project , clique em Add Reference .
    2. Na caixa de diálogo Add Reference , na guia .NET , clique em Procurar e localize o arquivo ConvertDStoRS.dll que você criou na etapa 6 da subseção de criar uma DLL de .NET Visual Basic deste artigo.
    3. Clique em ConvertDStoRS.dll , clique em Selecionar e, em seguida, clique em OK .
    4. Na caixa de diálogo Add Reference , clique na guia COM .
    5. Clique em Microsoft ActiveX Data Objects Library 2.6 (ou uma versão posterior) na lista Nome do componente , clique em Selecionar e, em seguida, clique em OK .
  3. Na Module1.vb, substitua o código existente com o seguinte código:
    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. Criar e executar o projeto. Observe que a contagem de registros é exibida na janela do console.
Observação Para lidar com caracteres especiais nos dados, escreva a instrução de processamento com o atributo de codificação. Você pode fazer essa alteração na classe ConvertToRs mencionada no arquivo class1.vb da seção "Criar uma DLL do .NET do Visual Basic" neste artigo ou no arquivo result.xml. Observe que a instrução de processamento só informa o formato de codificação para o analisador e os dados devem estar no formato de codificação especificado. Por exemplo:
<?xml version="1.0" encoding="ISO-8859-1"?><?xml version="1.0" encoding="UTF-8"?> 
você pode controlar a codificação de dados no .NET várias maneiras. Para exemplo: XmlTextWriter construtor pode ser usado.
Public Sub New(Stream, Encoding)
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
308064Como persistir um ConjuntoDeDados ADO.NET como XML usando o Visual Basic .NET
301216Como preencher um objeto DataSet de um banco de dados usando o Visual Basic .NET
313590INFO: Guia para o ADO.NET
313649INFO: Guia para integração do XML com o ADO.NET

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 316337 - Última Revisão: 11/28/2007 18:04:23 - Revisão: 7.1

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

  • kbmt kbdataadapter kbhowtomaster kbsqlclient kbsystemdata KB316337 KbMtpt
Comentários