Přidávání poznámek k typem datových sad

Poznámky umožňují upravit názvy prvků v zadaném typu DataSet beze změny základního schématu. Úprava názvů prvků v podkladovém schématu by způsobila, že typ DataSet odkazuje na objekty, které ve zdroji dat neexistují, a také ztratí odkaz na objekty, které existují ve zdroji dat.

Pomocí anotací můžete přizpůsobit názvy objektů ve vašem typovaném DataSet na smysluplnější názvy, což činí kód čitelnějším a typovaný DataSet snadněji použitelným pro klienty, zatímco základní schéma zůstává nedotčeno. Například následující prvek schématu Customers pro tabulku databáze Northwind by měl za následek název objektu DataRow jako CustomersRow a pojmenovaný DataRowCollection jako Customers.

<xs:element name="Customers">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

DataRowCollection Název Customers je smysluplný v kódu klienta, ale DataRow název CustomersRow je zavádějící, protože se jedná o jeden objekt. V běžných scénářích by se objekt odkazoval bez identifikátoru Row a místo toho by se jednoduše označoval jako Customer objekt. Řešením je anotovat schéma a identifikovat nové názvy objektů DataRow a DataRowCollection objektů. Následuje anotovaná verze předchozího schématu.

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

Zadání typedName hodnoty Customer bude mít za následek název objektu DataRow. Zadáním typedPlural hodnoty Customers zachováte DataRowCollection název zákazníků.

V následující tabulce jsou uvedeny poznámky, které jsou k dispozici pro použití.

Poznámka Popis
typedName Název objektu.
typedPlural Název kolekce objektů.
typedParent Název objektu, pokud se odkazuje v nadřazené relaci.
typedChildren Název metody pro vrácení objektů z podřízené relace.
nullValue Hodnota, pokud je podkladová hodnota DBNull. Poznámky najdete v následující tabulce nullValue . Výchozí hodnota je _throw.

Následující tabulka ukazuje hodnoty, které lze zadat pro poznámku nullValue .

nullValue – hodnota Popis
Hodnota nahrazení Zadejte hodnotu, která se má vrátit. Vrácená hodnota se musí shodovat s typem prvku. Slouží nullValue="0" například k vrácení 0 pro celočíselná pole s hodnotou null.
_hodit Vyvolá výjimku. Toto je výchozí hodnota.
_nula Vrátí nulový odkaz nebo vyvolá výjimku, pokud je zjištěn primitivní typ.
_prázdný V případě řetězců vrátí hodnotu String.Empty, v opačném případě vrátí objekt vytvořený z prázdného konstruktoru. Pokud je zjištěn primitivní typ, vyvolá výjimku.

V následující tabulce jsou uvedeny výchozí hodnoty pro objekty v zadaném typu DataSet a dostupné poznámky.

Objekt/Metoda/Událost Výchozí Poznámka
Datová tabulka NázevTabulkyTabulkaDat typedPlural
Datová tabulka Metody NewTableNameRow

AddTableNameRow

DeleteTableNameRow
zadanéJméno
DataRowCollection NázevTabulky typedPlural
DataRow TableNameRow zadanéJméno
DataColumn DataTable.ColumnNameColumn

DataRow.ColumnName
zadanéJméno
Vlastnost NázevVlastnosti zadanéJméno
Dětský přistupovač GetChildTableNameRows typovéDěti
Rodičovský Přístup TableNameRow typovanýRodič
Dataset Události UdálostZměnyŘádkuTabulky (TableNameRowChangeEvent)

TableNameRowChangeEventHandler
zadanéJméno

Chcete-li použít typové DataSet poznámky, musíte do schématu XSD (Xml Schema Definition Language) zahrnout následující xmlns odkaz. Pokud chcete vytvořit xsd z databázových tabulek, podívejte se na WriteXmlSchema nebo Práce s datovými sadami v sadě Visual Studio.

xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"

Následuje ukázkové schéma s poznámkami, které zveřejňuje Customers tabulku Northwind databáze s relačním vztahem k zahrnuté Orders tabulce.

<?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>

Následující příklad kódu používá silně typovaný DataSet vytvořený z ukázkového schématu. Slouží SqlDataAdapter k naplnění Customers tabulky a další SqlDataAdapter k naplnění Orders tabulky. Silně typované DataSet definují 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)
    {

    }

Viz také