Partilhar via


Anotando conjuntos de dados tipados

As anotações permitem modificar os nomes dos elementos digitados DataSet sem modificar o esquema subjacente. Modificar os nomes dos elementos no seu esquema subjacente faria com que o tipo DataSet se referisse a objetos que não existem na fonte de dados, bem como perderia a referência aos objetos que existem na fonte de dados.

Usando anotações, pode personalizar os nomes dos objetos no seu tipo DataSet com nomes mais significativos, tornando o código mais legível e o seu texto DataSet mais fácil de usar pelos clientes, mantendo o esquema subjacente intacto. Por exemplo, o seguinte elemento de esquema para a tabela Customers da base de dados Northwind resultaria num DataRow nome de objeto de CustomersRow e um DataRowCollection chamado Clientes.

<xs:element name="Customers">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

Um DataRowCollection nome de Customers é significativo no código do cliente, mas um DataRow nome de CustomersRow é enganador porque é um único objeto. Além disso, em cenários comuns, o objeto seria referido sem o Row identificador e, em vez disso, seria simplesmente referido como objeto Customer . A solução é anotar o esquema e identificar novos nomes para os objetos DataRow e DataRowCollection. A seguir está a versão anotada do esquema anterior.

<xs:element name="Customers" codegen:typedName="Customer" codegen:typedPlural="Customers">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

Especificar um typedName valor de Customer resultará num DataRow nome de objeto como Cliente. Especificar um typedPlural valor de Customers preserva o DataRowCollection nome dos Clientes.

A tabela a seguir mostra as anotações disponíveis para uso.

Anotação Descrição
typedName Nome do objeto.
typedPlural Nome de uma coleção de objetos.
typedParent Nome do objeto quando referido em um relacionamento parental.
typedCrianças Nome do método para retornar objetos de uma relação filho.
nullValue Valor se o valor subjacente for DBNull. Consulte a tabela seguinte para as anotações nullValue. O padrão é _throw.

A tabela seguinte mostra os valores que podem ser especificados para a nullValue anotação.

Valor nullValue Descrição
Valor de substituição Especifique um valor a ser retornado. O valor retornado deve corresponder ao tipo do elemento. Por exemplo, use nullValue="0" para retornar 0 para campos inteiros nulos.
_lançar Lance uma exceção. Este é o padrão.
_null Retornar uma referência nula ou lançar uma exceção se um tipo primitivo for encontrado.
_empty Para strings, retorne String.Empty, caso contrário, retorne um objeto criado a partir de um construtor vazio. Se um tipo primitivo for encontrado, lance uma exceção.

A tabela seguinte mostra os valores padrão dos objetos num tipo DataSet e as anotações disponíveis.

Objeto/Método/Evento Predefinido Anotação
Tabela de dados TabelaNomeTabelaDeDados typedPlural
Tabela de dados Metodologia NewTableNameRow

AdicionarLinhaNomeTabela

DeleteTableNameRow
typedName
DataRowCollection Nome da Tabela typedPlural
DataRow NomeDaTabelaLinha typedName
DataColumn TabelaDeDados.NomeDaColuna

DataRow.ColumnName
typedName
Propriedade Nome da propriedade typedName
Criança Acessor GetChildTableNameRows typedCrianças
Pai Acessor NomeDaTabelaLinha typedParent
Conjunto de dados Eventos EventoDeMudançaDeLinhaNomeDaTabela

TableNameRowChangeEventHandler
typedName

Para usar anotações digitadas DataSet , deve incluir a seguinte xmlns referência no seu esquema XML Schema Definition Language (XSD). Para criar um xsd a partir de tabelas de banco de dados, consulte WriteXmlSchema ou Trabalhando com conjuntos de dados no Visual Studio.

xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"

Segue-se um exemplo de esquema anotado que expõe a tabela Customers da base de dados Northwind com uma relação incluída com a tabela Orders.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="CustomerDataSet"
      xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"
      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" codegen:typedName="Customer" codegen:typedPlural="Customers">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="CustomerID"
codegen:typedName="CustomerID" type="xs:string" minOccurs="0" />
              <xs:element name="CompanyName"
codegen:typedName="CompanyName" type="xs:string" minOccurs="0" />
              <xs:element name="Phone" codegen:typedName="Phone" codegen:nullValue="" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Orders" codegen:typedName="Order" codegen:typedPlural="Orders">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="OrderID" codegen:typedName="OrderID"
type="xs:int" minOccurs="0" />
              <xs:element name="CustomerID"
codegen:typedName="CustomerID"                  codegen:nullValue="" type="xs:string" minOccurs="0" />
              <xs:element name="EmployeeID"
codegen:typedName="EmployeeID" codegen:nullValue="0"
type="xs:int" minOccurs="0" />
              <xs:element name="OrderAdapter"
codegen:typedName="OrderAdapter" codegen:nullValue="1980-01-01T00:00:00"
type="xs:dateTime" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint1">
      <xs:selector xpath=".//Customers" />
      <xs:field xpath="CustomerID" />
    </xs:unique>
    <xs:keyref name="CustOrders" refer="Constraint1"
codegen:typedParent="Customer" codegen:typedChildren="GetOrders">
      <xs:selector xpath=".//Orders" />
      <xs:field xpath="CustomerID" />
    </xs:keyref>
  </xs:element>
</xs:schema>

O seguinte exemplo de código utiliza um DataSet fortemente tipado criado a partir do esquema de exemplo. Usa um SqlDataAdapter para preencher a Customers tabela e outro SqlDataAdapter para preencher a Orders mesa. A expressão fortemente tipada DataSet define as DataRelations.

' Assumes a valid SqlConnection object named connection.
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _
    "SELECT CustomerID, CompanyName, Phone FROM Customers", &
    connection)
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _
    "SELECT OrderID, CustomerID, EmployeeID, OrderAdapter FROM Orders", &
    connection)

' Populate a strongly typed DataSet.
connection.Open()
Dim customers As CustomerDataSet = New CustomerDataSet()
customerAdapter.Fill(customers, "Customers")
orderAdapter.Fill(customers, "Orders")
connection.Close()

' Add a strongly typed event.
AddHandler customers.Customers.CustomerChanged, &
    New CustomerDataSet.CustomerChangeEventHandler( _
    AddressOf OnCustomerChanged)

' Add a strongly typed DataRow.
Dim newCustomer As CustomerDataSet.Customer = _
    customers.Customers.NewCustomer()
newCustomer.CustomerID = "NEW01"
newCustomer.CompanyName = "My New Company"
customers.Customers.AddCustomer(newCustomer)

' Navigate the child relation.
Dim customer As CustomerDataSet.Customer
Dim order As CustomerDataSet.Order

For Each customer In customers.Customers
  Console.WriteLine(customer.CustomerID)
  For Each order In customer.GetOrders()
    Console.WriteLine(vbTab & order.OrderID)
  Next
Next

Private Shared Sub OnCustomerChanged( _
    sender As Object, e As CustomerDataSet.CustomerChangeEvent)

End Sub
// Assumes a valid SqlConnection object named connection.
SqlDataAdapter customerAdapter = new SqlDataAdapter(
    "SELECT CustomerID, CompanyName, Phone FROM Customers",
    connection);
SqlDataAdapter orderAdapter = new SqlDataAdapter(
    "SELECT OrderID, CustomerID, EmployeeID, OrderAdapter FROM Orders",
    connection);

// Populate a strongly typed DataSet.
connection.Open();
CustomerDataSet customers = new CustomerDataSet();
customerAdapter.Fill(customers, "Customers");
orderAdapter.Fill(customers, "Orders");
connection.Close();

// Add a strongly typed event.
customers.Customers.CustomerChanged += new
  CustomerDataSet.CustomerChangeEventHandler(OnCustomerChanged);

// Add a strongly typed DataRow.
CustomerDataSet.Customer newCustomer =
    customers.Customers.NewCustomer();
newCustomer.CustomerID = "NEW01";
newCustomer.CompanyName = "My New Company";
customers.Customers.AddCustomer(newCustomer);

// Navigate the child relation.
foreach(CustomerDataSet.Customer customer in customers.Customers)
{
  Console.WriteLine(customer.CustomerID);
  foreach(CustomerDataSet.Order order in customer.GetOrders())
    Console.WriteLine("\t" + order.OrderID);
}

protected static void OnCustomerChanged(object sender, CustomerDataSet.CustomerChangeEvent e)
    {

    }

Ver também