Gerando DataSets fortemente tipados

Considerando um esquema XML que está em conformidade com o padrão de linguagem de definição de esquema XML padrão da linguagem (XSD), você pode gerar um DataSet fortemente tipado usando a ferramenta XSD.exe fornecida com o SDK (Software Development Kit) do Windows.

(Para criar um xsd de tabelas de banco de dados, consulte WriteXmlSchema ou Trabalhar com conjuntos de dados no Visual Studio.)

O código a seguir mostra a sintaxe para gerar um DataSetusando essa ferramenta.

xsd.exe /d /l:CS XSDSchemaFileName.xsd /eld /n:XSDSchema.Namespace  

Nesta sintaxe, a diretiva /d diz à ferramenta para gerar um DataSet e /l: diz à ferramenta qual idioma usar (por exemplo, C# ou Visual Basic .NET). A diretiva opcional /eld especifica que você pode usar o LINQ to DataSet para consultar o DataSet gerado. Essa opção é usada quando a opção /d também é especificada. Para obter mais informações, consulte Consultar conjuntos de dados tipados. A diretiva opcional /n: diz à ferramenta para também gerar um namespace para o DataSet nomeado XSDSchema.Namespace. A saída do comando é XSDSchemaFileName.cs, o que pode ser compilado e usado em um aplicativo ADO.NET. O código gerado pode ser compilado como uma biblioteca ou um módulo.

O código a seguir mostra a sintaxe para compilar o código gerado como uma biblioteca usando o compilador C# (csc.exe).

csc.exe /t:library XSDSchemaFileName.cs /r:System.dll /r:System.Data.dll  

A política /t: diz à ferramenta para criar em uma biblioteca e as políticas /r: especificam as bibliotecas dependentes necessárias para compilar. A saída do comando é XSDSchemaFileName.dll, que pode ser passado para o compilador ao criar um aplicativo do ADO.NET com a política /r:.

O código a seguir mostra a sintaxe para acessar o namespace passado para XSD.exe em um aplicativo ADO.NET.

Imports XSDSchema.Namespace  
using XSDSchema.Namespace;  

O exemplo de código a seguir usa um DataSet nomeado CustomerDataSet para carregar uma lista de clientes do banco de dados Northwind. Uma vez que os dados estiverem carregados usando o método Fill, o exemplo percorre em loop cada cliente na tabela Customers usando o objeto tipado CustomersRow (DataRow). Isso fornece acesso direto à coluna CustomerID, em vez de ser pelo DataColumnCollection.

Dim customers As CustomerDataSet= New CustomerDataSet()  
Dim adapter As SqlDataAdapter New SqlDataAdapter( _  
  "SELECT * FROM dbo.Customers;", _  
  "Data Source=(local);Integrated " & _  
  "Security=SSPI;Initial Catalog=Northwind")  
  
adapter.Fill(customers, "Customers")  
  
Dim customerRow As CustomerDataSet.CustomersRow  
For Each customerRow In customers.Customers  
  Console.WriteLine(customerRow.CustomerID)  
Next  
CustomerDataSet customers = new CustomerDataSet();  
SqlDataAdapter adapter = new SqlDataAdapter(  
  "SELECT * FROM dbo.Customers;",  
  "Data Source=(local);Integrated " +  
  "Security=SSPI;Initial Catalog=Northwind");  
  
adapter.Fill(customers, "Customers");  
  
foreach(CustomerDataSet.CustomersRow customerRow in customers.Customers)  
  Console.WriteLine(customerRow.CustomerID);  

Veja a seguir o esquema XML usado para o exemplo:

<?xml version="1.0" encoding="utf-8"?>  
<xs:schema id="CustomerDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
  <xs:element name="CustomerDataSet" msdata:IsDataSet="true">  
    <xs:complexType>  
      <xs:choice maxOccurs="unbounded">  
        <xs:element name="Customers">  
          <xs:complexType>  
            <xs:sequence>  
              <xs:element name="CustomerID" type="xs:string" minOccurs="0" />  
            </xs:sequence>  
          </xs:complexType>  
        </xs:element>  
      </xs:choice>  
    </xs:complexType>  
  </xs:element>  
</xs:schema>  

Confira também