Delen via


Aantekeningen toevoegen aan getypte gegevenssets

Met aantekeningen kunt u de namen van de elementen in uw getypte DataSet wijzigen zonder het onderliggende schema te wijzigen. Als u de namen van de elementen in het onderliggende schema wijzigt, verwijst de getypte DataSet naar objecten die niet aanwezig zijn in de gegevensbron en verliest u een verwijzing naar de objecten die wel in de gegevensbron aanwezig zijn.

Met behulp van aantekeningen kunt u de namen van objecten in uw getypte DataSet aanpassen met zinvollere namen, waardoor code beter leesbaar is en uw getypte DataSet gemakkelijker te gebruiken is voor clients, terwijl het onderliggende schema intact blijft. Het volgende schema-element voor de tabel Klanten van de Northwind-database zou bijvoorbeeld resulteren in een DataRow-objectnaam van CustomersRow en een DataRowCollection benoemde Customers.

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

Een DataRowCollection-naam van Klanten is zinvol in clientcode, maar een DataRow-naam van CustomersRow is misleidend omdat het één object is. In veelvoorkomende scenario's wordt het object ook zonder rij-id aangeduid en wordt in plaats daarvan gewoon een klantobject genoemd. De oplossing is het maken van aantekeningen bij het schema en het identificeren van nieuwe namen voor de DataRow - en DataRowCollection-objecten . Hieronder volgt de geannoteerde versie van het vorige 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>  

Als u een typedName-waarde van De klant opgeeft, resulteert dit in een DataRow-objectnaam van De klant. Als u een typedPlural-waarde van Klanten opgeeft, blijft de DataRowCollection-naam van klanten behouden.

In de volgende tabel ziet u de aantekeningen die beschikbaar zijn voor gebruik.

Annotatie Beschrijving
typedName Naam van het object.
getyptPlural Naam van een verzameling objecten.
getyptParent De naam van het object waarnaar wordt verwezen in een bovenliggende relatie.
getypte Kleinkinderen Naam van de methode voor het retourneren van objecten uit een onderliggende relatie.
nullValue Waarde als de onderliggende waarde DBNull is. Zie de volgende tabel voor nullValue-aantekeningen . De standaardwaarde is _throw.

In de volgende tabel ziet u de waarden die kunnen worden opgegeven voor de annotatie nullValue .

nullValue-waarde Beschrijving
Vervangingswaarde Geef een waarde op die moet worden geretourneerd. De geretourneerde waarde moet overeenkomen met het type element. Gebruik bijvoorbeeld nullValue="0" om 0 te retourneren voor velden met null-gehele getallen.
_Gooien Gooi een uitzondering. Dit is de standaardinstelling.
_null Retourneert een null-verwijzing of genereert een uitzondering als een primitief type wordt aangetroffen.
_Lege Voor tekenreeksen retourneert u String.Empty, anders retourneert u een object dat is gemaakt op basis van een lege constructor. Als er een primitief type wordt aangetroffen, genereert u een uitzondering.

De volgende tabel bevat standaardwaarden voor objecten in een getypte DataSet en de beschikbare aantekeningen.

Object/methode/gebeurtenis Standaardinstelling Aantekening
Datatable TableNameDataTable getyptPlural
Gegevenstabelmethoden NewTableNameRow

AddTableNameRow

DeleteTableNameRow
typedName
DataRowCollection TableName getyptPlural
DataRow TableNameRow typedName
Datacolumn DataTable.ColumnNameColumn

DataRow.ColumnName
typedName
Eigenschappen PropertyName typedName
Onderliggende toegangsbeheer GetChildTableNameRows getypte Kleinkinderen
Bovenliggende toegangsbeheer TableNameRow getyptParent
DataSet-gebeurtenissen TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Als u getypte gegevenssetaantekeningen wilt gebruiken, moet u de volgende XMLNS-verwijzing opnemen in het XSD-schema (XML Schema Definition Language). Als u een xsd wilt maken op basis van databasetabellen, raadpleegt WriteXmlSchema of werkt u met gegevenssets in Visual Studio.

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

Hier volgt een voorbeeld van een geannoteerd schema waarmee de tabel Klanten van de Northwind-database wordt weergegeven met een relatie tot de tabel 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>  

In het volgende codevoorbeeld wordt een sterk getypte DataSet gebruikt die is gemaakt op basis van het voorbeeldschema. Er wordt een SqlDataAdapter gebruikt om de tabel Klanten te vullen en een andere SqlDataAdapter om de tabel Orders te vullen. De sterk getypte DataSet definieert de 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)  
    {  
  
    }  

Zie ook