Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Adnotacje umożliwiają modyfikowanie nazw elementów wpisanych DataSet bez modyfikowania podstawowego schematu. Zmodyfikowanie nazw elementów w bazowym schemacie spowodowałoby, że typizowane DataSet odnosiłoby się do obiektów, które nie istnieją w źródle danych, i traciłoby odwołanie do obiektów, które istnieją w źródle danych.
Za pomocą adnotacji można dostosować nazwy obiektów w Twoim typowanym DataSet na bardziej znaczące, dzięki czemu kod jest bardziej czytelny i łatwiej używać przez klientów Twojego DataSet, pozostawiając schemat podstawowy bez zmian. Na przykład następujący element schematu dla Customers tabeli Northwind bazy danych skutkowałby nazwą obiektu CustomersRowDataRow i DataRowCollection o nazwie Customers.
<xs:element name="Customers">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
Nazwa DataRowCollectionCustomers ma znaczenie w kodzie klienta, ale nazwa DataRowCustomersRow jest myląca, ponieważ jest to pojedynczy obiekt. Ponadto w typowych scenariuszach obiekt będzie określany bez identyfikatora Row , a zamiast tego będzie po prostu określany jako Customer obiekt. Rozwiązaniem jest dodawanie adnotacji do schematu i identyfikowanie nowych nazw obiektów DataRow i DataRowCollection . Poniżej znajduje się adnotacja wersji poprzedniego schematu.
<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>
Określenie Customer wartości DataRow spowoduje, że nazwą obiektu typedName będzie Customer. Określenie typedPlural wartości parametru Customers zachowuje DataRowCollection nazwę Customers.
W poniższej tabeli przedstawiono adnotacje dostępne do użycia.
| Adnotacja | Opis |
|---|---|
typedName |
Nazwa obiektu. |
typedPlural |
Nazwa kolekcji obiektów. |
typedParent |
Nazwa obiektu, o którym mowa w relacji nadrzędnej. |
typedChildren |
Nazwa metody zwracania obiektów z relacji podrzędnej. |
nullValue |
Wartość, jeśli wartość źródłowa to DBNull. Zobacz poniższą tabelę z adnotacjami nullValue. Wartość domyślna to _throw. |
W poniższej tabeli przedstawiono wartości, które można określić dla adnotacji nullValue .
wartość nullValue |
Opis |
|---|---|
| Wartość zastępcza | Określ wartość, która ma zostać zwrócona. Zwrócona wartość musi być zgodna z typem elementu. Na przykład użyj polecenia nullValue="0" , aby zwrócić wartość 0 dla pól liczb całkowitych o wartości null. |
_throw |
Rzuć wyjątek. Jest to wartość domyślna. |
_null |
Zwraca odwołanie o wartości null lub zgłasza wyjątek, jeśli napotkano typ pierwotny. |
_empty |
W przypadku ciągów zwróć String.Empty, w przeciwnym razie zwróć obiekt utworzony z pustego konstruktora. Jeśli napotkasz typ pierwotny, rzuć wyjątek. |
W poniższej tabeli przedstawiono wartości domyślne dla obiektów w typie DataSet i dostępnych adnotacjach.
| Obiekt/Metoda/Zdarzenie | Wartość domyślna | Adnotacja |
|---|---|---|
DataTable |
TableNameDataTable |
typedPlural |
DataTable Metody |
NewTableNameRowAddTableNameRowDeleteTableNameRow |
typedName |
DataRowCollection |
TableName |
typedPlural |
DataRow |
TableNameRow |
typedName |
DataColumn |
DataTable.ColumnNameColumnDataRow.ColumnName |
typedName |
| Własność | PropertyName |
typedName |
| Dziecko Akcesor | GetChildTableNameRows |
typedChildren |
| Rodzic Akcesor | TableNameRow |
typedParent |
DataSet Zdarzenia |
TableNameRowChangeEventTableNameRowChangeEventHandler |
typedName |
Aby użyć typowanych DataSet adnotacji, należy uwzględnić następującą xmlns referencję w schemacie języka definicji schematu XML (XSD). Aby utworzyć xsd z tabel bazy danych, zobacz WriteXmlSchema lub Praca z zestawami danych w programie Visual Studio.
xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"
Poniżej znajduje się przykładowy schemat z adnotacjami, który uwidacznia Customers tabelę Northwind bazy danych z uwzględnioną relacją Orders do tabeli.
<?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>
W poniższym przykładzie kodu użyto silnie typizowanego DataSet, który został utworzony na podstawie przykładowego schematu. Używa jednego SqlDataAdapter do wypełnienia tabeli Customers, a drugiego SqlDataAdapter do wypełnienia tabeli Orders. Silnie typizowane DataSet definiuje element DataRelations. Zainstaluj pakiet NuGet Microsoft.Data.SqlClient i zaimportuj jego przestrzeń nazw. Obiekt connection musi być obiektem SqlConnection.
' 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)
{
}