Dela via


Kommentera inskrivna datauppsättningar

Med anteckningar kan du ändra namnen på elementen i det angivna DataSet utan att ändra det underliggande schemat. Om du ändrar namnen på elementen i det underliggande schemat skulle det leda till att den inskrivna DataSet refererar till objekt som inte finns i datakällan, samt att en referens till de objekt som finns i datakällan förloras.

Med hjälp av anteckningar kan du anpassa namnen på objekt i din typade DataSet med mer meningsfulla namn, vilket gör koden mer läsbar och din typinskrivna DataSet enklare för klienter att använda, samtidigt som det underliggande schemat lämnas intakt. Följande schemaelement för tabellen Kunder i Northwind-databasen skulle till exempel resultera i ett DataRow-objektnamn för CustomersRow och ett DataRowCollection namngivet Kunder.

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

Ett DataRowCollection-namn på kunder är meningsfullt i klientkoden, men ett DataRow-namn på CustomersRow är missvisande eftersom det är ett enda objekt. I vanliga scenarier skulle objektet också refereras till utan radidentifieraren och skulle i stället bara kallas för ett kundobjekt . Lösningen är att kommentera schemat och identifiera nya namn för DataRow- och DataRowCollection-objekten. Följande är den kommenterade versionen av föregående schema.

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

Om du anger värdet typedName för Kunden resulterar det i ett DataRow-objektnamn för kunden. Om du anger ett typedPlural-värde för Kunder bevaras DataRowCollection-namnetKunder.

I följande tabell visas de anteckningar som är tillgängliga för användning.

Anteckning beskrivning
typedName Namnet på objektet.
typedPlural Namn på en samling objekt.
typedParent Namnet på objektet när det refereras till i en överordnad relation.
typedChildren Namnet på metoden för att returnera objekt från en underordnad relation.
nullValue Värde om det underliggande värdet är DBNull. Se följande tabell för nullValue-anteckningar . Standardvärdet är _throw.

I följande tabell visas de värden som kan anges för nullValue-anteckningen.

nullValue-värde beskrivning
Ersättningsvärde Ange ett värde som ska returneras. Det returnerade värdet måste matcha elementtypen. Använd till exempel nullValue="0" för att returnera 0 för null-heltalsfält.
_Kasta Utlöser ett undantag. Det här är standardinställningen.
_Null Returnera en null-referens eller generera ett undantag om en primitiv typ påträffas.
_Tom För strängar returnerar du String.Empty, annars returnerar du ett objekt som skapats från en tom konstruktor. Om en primitiv typ påträffas utlöser du ett undantag.

I följande tabell visas standardvärden för objekt i en typbeskriven DataSet och tillgängliga anteckningar.

Objekt/metod/händelse Standardvärde Annotation
Datatable TableNameDataTable typedPlural
DataTable-metoder NewTableNameRow

AddTableNameRow

DeleteTableNameRow
typedName
DataRowCollection TableName typedPlural
Datarow TableNameRow typedName
DataColumn DataTable.ColumnNameColumn

DataRow.ColumnName
typedName
Property PropertyName typedName
Underordnad accessor GetChildTableNameRows typedChildren
Överordnad accessor TableNameRow typedParent
Datauppsättningshändelser TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Om du vill använda inskrivna DataSet-anteckningar måste du inkludera följande xmlns-referens i XSD-schemat (XML Schema Definition Language). Information om hur du skapar en xsd från databastabeller WriteXmlSchema finns i eller Arbeta med datauppsättningar i Visual Studio.

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

Följande är ett exempel på ett kommenterat schema som visar tabellen Kunder i Northwind-databasen med en relation till tabellen Beställningar som ingår.

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

I följande kodexempel används en starkt typinskriven DataSet som skapats från exempelschemat. Den använder en SqlDataAdapter för att fylla i tabellen Kunder och en annan SqlDataAdapter för att fylla i tabellen Beställningar . Den starkt inskrivna DataSeten definierar 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)  
    {  
  
    }  

Se även