Dodawanie adnotacji do typizowanych elementów DataSet

Adnotacje umożliwiają modyfikowanie nazw elementów wpisanych DataSet bez modyfikowania bazowego schematu. Zmodyfikowanie nazw elementów w bazowym schemacie spowodowałoby, że typowany zestaw Danych odnosi się do obiektów, które nie istnieją w źródle danych, a także utracić odwołanie do obiektów, które istnieją w źródle danych.

Za pomocą adnotacji można dostosować nazwy obiektów w wpisanym zestawie danych z bardziej zrozumiałymi nazwami, dzięki czemu kod będzie bardziej czytelny, a wpisany zestaw danych ułatwia klientom korzystanie z niego, pozostawiając schemat podstawowy bez zmian. Na przykład następujący element schematu dla tabeli Customers bazy danych Northwind spowoduje, że nazwa obiektu DataRow customersRow i DataRowCollection nazwany 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 DataRowCollection klientów ma znaczenie w kodzie klienta, ale nazwa DataRow customersRow jest myląca, ponieważ jest to pojedynczy obiekt. Ponadto w typowych scenariuszach obiekt zostanie odwołany bez identyfikatora wiersza , a zamiast tego będzie po prostu określany jako obiekt Klienta . 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 wartości typedName klienta spowoduje, że nazwa obiektu DataRow klienta. Określenie wartości typedPlural kliencizachowuje nazwę DataRowCollection 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. Poniższa tabela zawiera adnotacje 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.
_Rzucać Zgłaszanie wyjątku. Jest to opcja domyślna.
_Null 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 napotkano typ pierwotny, wyrzuć wyjątek.

W poniższej tabeli przedstawiono wartości domyślne dla obiektów w typowanym zestawie danych i dostępnych adnotacjach.

Object/Method/Event Wartość domyślna Annotation
Datatable TableNameDataTable typedPlural
Metody DataTable NewTableNameRow

AddTableNameRow

DeleteTableNameRow
typedName
Datarowcollection TableName typedPlural
Datarow TableNameRow typedName
Datacolumn DataTable.ColumnNameColumn

DataRow.ColumnName
typedName
Właściwości Propertyname typedName
Akcesorium podrzędne GetChildTableNameRows typedChildren
Akcesorium nadrzędne TableNameRow typedParent
Zdarzenia zestawu danych TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Aby użyć adnotacji typed DataSet , należy uwzględnić następujące odwołania xmlns 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 przedstawiono przykładowy schemat z adnotacjami, który uwidacznia tabelę Customers bazy danych Northwind z uwzględniona tabelą Orders (Zamówienia).

<?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 zestawu danych utworzonego na podstawie przykładowego schematu. Używa jednego do wypełnienia tabeli Customers i drugiego SqlDataAdapterw celu wypełnienia tabeli Orders (SqlDataAdapterZamówienia). Silnie typizowanego elementu DataSet definiuje elementy 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)  
    {  
  
    }  

Zobacz też