Sdílet prostřednictvím


Zadávání poznámek k typovým datovým sadám

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 zadaná datová sada odkazuje na objekty, které ve zdroji dat neexistují, a také ztratí odkaz na objekty, které existují ve zdroji dat.

Pomocí poznámek můžete přizpůsobit názvy objektů v zadané datové sadě smysluplnějšími názvy, což usnadňuje čtení kódu a typovou datovou sadu pro klienty a přitom ponechá základní schéma nedotčené. Například následující prvek schématu pro tabulku Customers databáze Northwind by výsledkem dataRow název objektu CustomersRow a pojmenovaný DataRowCollection Customers.

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

Název DataRowCollection pro Zákazníky je smysluplný v klientském kódu, ale název DataRow 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 řádku a místo toho by se jednoduše označoval jako objekt Zákazník . Řešením je anotovat schéma a identifikovat nové názvy objektů DataRow a DataRowCollection. 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í hodnoty typedName zákazníka bude mít za následek název objektu DataRow zákazníka. Zadáním typedPlural hodnota Customers zachovává DataRowCollection název Customers.

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 nullValue najdete v následující tabulce. Výchozí hodnota je _throw.

Následující tabulka ukazuje hodnoty, které lze zadat pro anotaci 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. Tato možnost je výchozí.
_Null 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é datové sadě a dostupné poznámky.

Object/Method/Event Výchozí Poznámka
Datatable TableNameDataTable typedPlural
Metody datových tabulek NewTableNameRow

AddTableNameRow

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

DataRow.ColumnName
typedName
Vlastnost Propertyname typedName
Podřízené přístupové objekty GetChildTableNameRows typedChildren
Nadřazený přístup TableNameRow typedParent
Události datové sady TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Chcete-li použít typové poznámky datové sady , musíte do schématu jazyka XSD (Xml Schema Definition Language) zahrnout následující odkazy xmlnů . Pokud chcete vytvořit xsd z databázových tabulek, podívejte WriteXmlSchema se nebo pracujete 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 tabulku Customers databáze Northwind s relací k zahrnuté tabulce Orders.

<?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á datovou sadu silného typu vytvořenou z ukázkového schématu. Používá jednu SqlDataAdapter k naplnění tabulky Customers (Zákazníci ) a druhou SqlDataAdapter k naplnění tabulky Orders (Objednávky ). Datová sada silného typu definuje 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é