Udostępnij przez


Dodawanie adnotacji do typów zestawów danych

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)
    {

    }

Zobacz także