Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
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 tabeli Customers bazy danych Northwind spowoduje, że obiekt będzie miał nazwę DataRow, a DataRowCollection nazwę Klienci.
<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 typedName wartości Customer spowoduje, że nazwa obiektu zostanie ustawiona na Customer. Określanie typedPlural wartości parametru Customers zachowuje DataRowCollection nazwę Klientów.
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ść bazowa 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 .
| nullValue, wartość | 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. |
| _rzut | Rzuć wyjątek. Jest to wartość domyślna. |
| _zero | Zwraca odwołanie o wartości null lub zgłasza wyjątek, jeśli napotkano typ pierwotny. |
| _pusty | W przypadku ciągów zwraca wartość String.Empty, w przeciwnym razie zwraca 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 | TabelaDanychNazwy | typedPlural |
| DataTable Metody | NewTableNameRow AddTableNameRow DeleteTableNameRow |
wpisanaNazwa |
| DataRowCollection | Nazwa Tabeli | typedPlural |
| DataRow | TableNameRow | wpisanaNazwa |
| Kolumna danych | DataTable.ColumnNameColumn DataRow.ColumnName |
wpisanaNazwa |
| Własność | NazwaWłaściwości | wpisanaNazwa |
| Dziecko Akcesor | GetChildTableNameRows | przepisaneDzieci |
| Rodzic Akcesor | TableNameRow | typedParent |
| Dataset Zdarzenia | TableNameRowChangeEvent TableNameRowChangeEventHandler |
wpisanaNazwa |
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 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)
{
}