Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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)
{
}