Aracılığıyla paylaş


Türü Belirtilmiş DataSets için Yorum Ekleme

Ek açıklamalar, temel şemayı değiştirmeden yazdığınız DataSet öğelerin adlarını değiştirmenize olanak tanır. Temel şemanızdaki öğelerin adlarını değiştirmek, yazılan DataSet'in veri kaynağında bulunmayan nesnelere başvurmasına ve veri kaynağında var olan nesnelere başvuruyu kaybetmesine neden olabilir.

Ek açıklamaları kullanarak, yazılan DataSet'inizdeki nesnelerin adlarını daha anlamlı adlarla özelleştirerek kodu daha okunabilir ve yazılan DataSet'inizi istemcilerin kullanmasını kolaylaştırırken, temel şemayı olduğu gibi bırakabilirsiniz. Örneğin, Northwind veritabanının Customers tablosu için aşağıdaki şema öğesi, CustomersRow adlı DataRow nesne adı ve adlandırılmış Müşteriler DataRowCollectionile sonuçlanır.

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

Müşteri DataRowCollection adı istemci kodunda anlamlıdır, ancak Tek bir nesne olduğundan CustomersRow'un DataRow adı yanıltıcıdır. Ayrıca, yaygın senaryolarda nesneye Satır tanımlayıcısı olmadan başvurulur ve bunun yerine yalnızca Customer nesnesi olarak adlandırılır. Çözüm, şemaya ek açıklama eklemek ve DataRow ve DataRowCollection nesneleri için yeni adlar belirlemektir. Aşağıda, önceki şemanın açıklamalı sürümü yer alır.

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

Customer'ın typedName değerinin belirtilmesi, Customer'nın DataRow nesne adıyla sonuçlanır. Müşterilerin typedPlural değerinin belirtilmesi, Müşterilerin DataRowCollection adını korur.

Aşağıdaki tabloda, kullanılabilecek ek açıklamalar gösterilmektedir.

Ek Açıklama Açıklama
typedName Nesnenin adı.
typedPlural Nesne koleksiyonunun adı.
typedParent Üst ilişkide başvurulduğunda nesnenin adı.
typedChildren Alt ilişkiden nesne döndürme yönteminin adı.
Nullvalue Temel alınan değer DBNull ise değer. nullValue ek açıklamaları için aşağıdaki tabloya bakın. Varsayılan değer _throw.

Aşağıdaki tabloda nullValue ek açıklaması için belirtilebilen değerler gösterilmektedir.

nullValue Değeri Açıklama
Değiştirme Değeri Döndürülecek değeri belirtin. Döndürülen değerin öğenin türüyle eşleşmesi gerekir. Örneğin, null tamsayı alanları için 0 döndürmek için kullanın nullValue="0" .
_Atmak Özel durum oluşturma. Bu varsayılan seçenektir.
_Null Null başvuru döndür veya ilkel bir türle karşılaşılırsa bir özel durum oluşturun.
_Boş Dizeler için String.Empty döndür, aksi takdirde boş bir oluşturucudan oluşturulan bir nesneyi döndür. İlkel bir türle karşılaşılırsa, bir özel durum atın.

Aşağıdaki tabloda, yazılan DataSet içindeki nesneler için varsayılan değerler ve kullanılabilir ek açıklamalar gösterilmektedir.

Nesne/Yöntem/Olay Varsayılan Annotation
Datatable TableNameDataTable typedPlural
DataTable Yöntemleri NewTableNameRow

AddTableNameRow

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

DataRow.ColumnName
typedName
Özellik ÖzellikAdı typedName
Alt Erişimci GetChildTableNameRows typedChildren
Üst Erişimci TableNameRow typedParent
DataSet Olayları TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Yazılan DataSet ek açıklamalarını kullanmak için XML Şema tanım dili (XSD) şemanıza aşağıdaki xmlns başvurularını eklemeniz gerekir. Veritabanı tablolarından xsd oluşturmak için bkz WriteXmlSchema . veya Visual Studio'da Veri Kümeleriyle Çalışma.

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

Aşağıda, Northwind veritabanının Customers tablosunu, dahil edilen Siparişler tablosuyla ilişkili olarak kullanıma sunan bir örnek açıklamalı şema verilmiştir.

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

Aşağıdaki kod örneği, örnek şemadan oluşturulmuş kesin olarak belirlenmiş bir DataSet kullanır. Müşteriler tablosunu doldurmak için biriniSqlDataAdapter, Siparişler tablosunu doldurmak için de başka bir SqlDataAdapter tablo kullanır. Kesin olarak yazılan DataSet, DataRelations'i tanımlar.

' 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)  
    {  
  
    }  

Ayrıca bkz.