Compartir a través de


Anotación de conjuntos de datos tipados

Las anotaciones permiten modificar los nombres de los elementos de su tipo DataSet sin modificar el esquema subyacente. La modificación de los nombres de los elementos del esquema subyacente provocaría que el tipo DataSet haga referencia a objetos que no existen en el origen de datos, así como perder una referencia a los objetos que existen en el origen de datos.

Con anotaciones, puede personalizar los nombres de los objetos en su tipo definido de DataSet con nombres más significativos, lo que hace que el código sea más legible y facilita su uso por parte de los clientes, al tiempo que deja intacto el esquema subyacente. Por ejemplo, el siguiente elemento de esquema para la Customers tabla de la Northwind base de datos daría como resultado un DataRow nombre de objeto de CustomersRow y un DataRowCollection denominado Customers.

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

Un DataRowCollection nombre de Customers es significativo en el código de cliente, pero un DataRow nombre de CustomersRow es engañoso porque es un único objeto. Además, en escenarios comunes, el objeto se denominaría sin el Row identificador y, en su lugar, se denominaría simplemente un Customer objeto . La solución consiste en anotar el esquema e identificar nuevos nombres para los DataRow objetos y DataRowCollection . A continuación se muestra la versión anotada del 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 un typedName valor de Customer dará como resultado un DataRow nombre de objeto de Customer. Al especificar un typedPlural valor de Customers se conserva el DataRowCollection nombre de Customers.

En la tabla siguiente se muestran las anotaciones disponibles para su uso.

Anotación Descripción
typedName Nombre del objeto.
typedPlural Nombre de una colección de objetos.
typedParent Nombre del objeto cuando se hace referencia al mismo en una relación primaria.
typedChildren Nombre del método para devolver objetos de una relación secundaria.
nullValue Valor si el valor subyacente es DBNull. Consulte la tabla siguiente para ver las anotaciones nullValue. El valor predeterminado es _throw.

En la tabla siguiente se muestran los valores que se pueden especificar para la nullValue anotación.

Valor nullValue Descripción
Valor de reemplazo Especifique un valor que se va a devolver. El valor devuelto debe coincidir con el tipo del elemento. Por ejemplo, use nullValue="0" para devolver 0 para campos enteros NULL.
_tirar Iniciar una excepción. Este es el valor predeterminado.
_nulo Devuelve una referencia nula o produce una excepción si se encuentra un tipo primitivo.
_vacío En el caso de las cadenas, devuelve String.Empty; de lo contrario, devuelve un objeto creado a partir de un constructor vacío. Si se encuentra un tipo primitivo, lance una excepción.

En la tabla siguiente se muestran los valores predeterminados de los objetos de un tipo DataSet y las anotaciones disponibles.

Objeto/Método/Evento Predeterminado Anotación
DataTable TableNameDataTable typedPlural
DataTable Métodos NewTableNameRow

AddTableNameRow

DeleteTableNameRow
typedName
DataRowCollection TableName typedPlural
DataRow TableNameRow typedName
DataColumn DataTable.ColumnNameColumn

DataRow.ColumnName
typedName
Propiedad nombre de la propiedad typedName
Descriptor de acceso secundario GetChildTableNameRows typedChildren
Descriptor de acceso principal TableNameRow typedParent
Conjunto de datos Eventos TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Para usar anotaciones DataSet tipadas, debe incluir la siguiente referencia xmlns en su esquema XSD. Para crear un xsd a partir de tablas de base de datos, consulte WriteXmlSchema o Trabajar con conjuntos de datos en Visual Studio.

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

A continuación se muestra un esquema anotado de ejemplo que expone la Customers tabla de la Northwind base de datos con una relación con la Orders tabla incluida.

<?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>

En el ejemplo de código siguiente se usa un elemento fuertemente tipado DataSet creado a partir del esquema de ejemplo. Usa uno SqlDataAdapter para rellenar la Customers tabla y otra SqlDataAdapter para rellenar la Orders tabla. El fuertemente tipado DataSet define 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)
    {

    }

Consulte también