Verwenden von Anmerkungen mit einem typisierten DataSet
Anmerkungen ermöglichen Ihnen die Namensänderung von Elementen in einem typisierten DataSet, ohne das zugrunde liegende Schema ändern zu müssen. Wenn Sie die Namen der Elemente im zugrunde liegenden Schema ändern würden, würde das typisierte DataSet auf Objekte verweisen, die nicht in der Datenquelle vorhanden sind, und der Verweis auf die in der Datenquelle vorhandenen Objekte ginge verloren.
Mit Hilfe von Anmerkungen können Sie die Namen von Objekten im typisierten DataSet in aussagekräftigere Namen ändern, so dass der Code leichter lesbar und die Verwendung des typisierten DataSets für Clients erleichtert wird, während das zugrunde liegende Schema gleichzeitig erhalten bleibt. Das folgende Schemaelement für die Customers-Tabelle der Northwind-Datenbank würde z. B. einen DataRow-Objektnamen CustomersRow und eine DataRowCollection namens Customers ergeben.
<xs:element name="Customers">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
Der DataRowCollection-Name Customers im Clientcode ist aussagekräftig, der DataRow-Name CustomersRow ist jedoch irreführend, weil es sich um ein einzelnes Objekt handelt. Außerdem würde in üblichen Szenarien ohne den Row-Bezeichner auf das Objekt verwiesen, d. h., dass stattdessen nur als Customer-Objekt darauf verwiesen würde. Die Lösung besteht darin, eine Anmerkung für das Schema festzulegen und neue Namen für die Objekte DataRow und DataRowCollection anzugeben. Der folgende Code zeigt das vorhergehende Schema mit Anmerkungen.
<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>
Wenn Sie einen typedName-Wert für Customer angeben, ergibt sich daraus der DataRow-Objektname Customer. Wenn ein typedPlural-Wert für Customers angegeben wird, bleibt der DataRowCollection-Name Customers erhalten.
In der folgenden Tabelle sind die möglichen Anmerkungen aufgeführt.
Anmerkung | Beschreibung |
---|---|
typedName | Objektname. |
typedPlural | Name einer Auflistung von Objekten. |
typedParent | Name des Objekts, wenn in einer übergeordneten Beziehung darauf verwiesen wird. |
typedChildren | Name der Methode zum Zurückgeben von Objekten aus einer untergeordneten Beziehung. |
nullValue | Wert, wenn der zugrunde liegende Wert DBNull lautet. Informationen zu nullValue-Anmerkungen finden Sie in der folgenden Tabelle. Der Standardwert ist _throw. |
In der folgenden Tabelle sind die Werte aufgeführt, die für die nullValue-Anmerkung angegeben werden können.
nullValue | Beschreibung |
---|---|
Ersatzwert | Gibt einen Wert an, der zurückgegeben werden soll. Der zurückgegebene Wert muss mit dem Elementtyp übereinstimmen. Verwenden Sie z. B. nullValue="0" , um 0 für NULL-Ganzzahlfelder zurückzugeben. |
_throw | Auslösen einer Ausnahme. Dies ist die Standardeinstellung. |
_null | Gibt einen Nullverweis aus oder löst eine Ausnahme aus, wenn ein primitiver Typ festgestellt wird. |
_empty | Für Zeichenfolgen wird String.Empty zurückgegeben, andernfalls wird ein Objekt zurückgegeben, das aus einem leeren Konstruktor erstellt wurde. Wenn ein primitiver Typ festgestellt wird, wird eine Ausnahme ausgelöst. |
In der folgenden Tabelle sind die Standardwerte für Objekte in einem typisierten DataSet und die verfügbaren Anmerkungen aufgeführt.
Objekt/Methode/Ereignis | Standardwert | Anmerkung |
---|---|---|
DataTable | TableNameDataTable | typedPlural |
DataTable-Methoden | NewTableNameRow
AddTableNameRow DeleteTableNameRow |
typedName |
DataRowCollection | TableName | typedPlural |
DataRow | TableNameRow | typedName |
DataColumn | DataTable.ColumnNameColumn
DataRow.ColumnName |
typedName |
Property | PropertyName | typedName |
Child-Accessor | GetChildTableNameRows | typedChildren |
Parent-Accessor | TableNameRow | typedParent |
DataSet-Ereignisse | TableNameRowChangeEvent
TableNameRowChangeEventHandler |
typedName |
Um typisierte DataSet-Anmerkungen verwenden zu können, müssen Sie den folgenden xmlns-Verweis in das Schema der XML-Schema Definition (XSD)-Sprache einfügen.
xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"
Der folgende Code ist ein Beispielschema mit Anmerkungen, das die Customers-Tabelle der Northwind-Datenbank mit einer Beziehung zur Orders-Tabelle zur Verfügung stellt.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="CustomerDataSet"
xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"
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="OrderDate" codegen:typedName="OrderDate" 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>
Im folgenden Codebeispiel wird ein DataSet mit strikter Typbindung verwendet, das aus dem Beispielschema erstellt wurde. Es verwendet einen DataAdapter zum Füllen der Customers-Tabelle und einen weiteren DataAdapter zum Füllen der Orders-Tabelle. Das DataSet mit strikter Typbindung definiert die DataRelations.
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" & _
"Initial Catalog=northwind")
Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName, Phone FROM Customers", &
nwindConn)
Dim orderDA As SqlDataAdapter = New SqlDataAdapter("SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders", &
nwindConn)
' Populate a strongly typed DataSet.
nwindConn.Open()
Dim custDS As CustomerDataSet = New CustomerDataSet()
custDA.Fill(custDS, "Customers")
orderDA.Fill(custDS, "Orders")
nwindConn.Close()
' Add a strongly typed event.
AddHandler custDS.Customers.CustomerChanged, &
New CustomerDataSet.CustomerChangeEventHandler(AddressOf OnCustomerChanged)
' Add a strongly typed DataRow.
Dim newCust As CustomerDataSet.Customer = custDS.Customers.NewCustomer()
newCust.CustomerID = "NEW01"
newCust.CompanyName = "My New Company"
custDS.Customers.AddCustomer(newCust)
' Navigate the child relation.
Dim customer As CustomerDataSet.Customer
Dim order As CustomerDataSet.Order
For Each customer In custDS.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
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName, Phone FROM Customers", nwindConn);
SqlDataAdapter orderDA = new SqlDataAdapter("SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders", nwindConn);
// Populate a strongly typed DataSet.
nwindConn.Open();
CustomerDataSet custDS = new CustomerDataSet();
custDA.Fill(custDS, "Customers");
orderDA.Fill(custDS, "Orders");
nwindConn.Close();
// Add a strongly typed event.
custDS.Customers.CustomerChanged += new
CustomerDataSet.CustomerChangeEventHandler(OnCustomerChanged);
// Add a strongly typed DataRow.
CustomerDataSet.Customer newCust = custDS.Customers.NewCustomer();
newCust.CustomerID = "NEW01";
newCust.CompanyName = "My New Company";
custDS.Customers.AddCustomer(newCust);
// Navigate the child relation.
foreach(CustomerDataSet.Customer customer in custDS.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)
{
}
Siehe auch
Arbeiten mit einem typisierten DataSet | Erstellen und Verwenden von DataSets | DataColumnCollection-Klasse | DataSet-Klasse