Aracılığıyla paylaş


Yazılan Veri Kümelerine Ek Açıklama 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ın DataSet veri kaynağında bulunmayan nesnelere başvurmasına ve veri kaynağında var olan nesnelere başvuruyu kaybetmesine neden olabilir.

Ek açıklamaları kullanarak, yazdığınız DataSet nesnelerin adlarını daha anlamlı adlarla özelleştirerek kodu daha okunabilir ve istemcilerin DataSet kullanmasını kolaylaştırırken, temel alınan şemayı olduğu gibi bırakabilirsiniz. Örneğin, Northwind veritabanının Customers tablosu için aşağıdaki şema öğesi, bir DataRow nesne adını CustomersRow ve DataRowCollection adı olarak Müşteriler ile 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>

DataRowCollection adı Customers istemci kodunda anlamlıdır, ancak DataRow adı CustomersRow yanıltıcıdır çünkü tek bir nesnedir. Ayrıca, yaygın senaryolarda, nesne tanımlayıcı olmadan Row adlandırılır ve bunun yerine yalnızca nesne Customer 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>

Bir typedNameCustomer değeri belirtilmesi, DataRow nesne adı olarak Customer ile sonuçlanacaktır. typedPlural değerinin Customers olarak belirtilmesi, DataRowCollection adını korur .

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

Açıklama Açıklama
typedName Nesnenin adı.
typedPlural Nesne koleksiyonunun adı.
typedParent Üst öğe ilişkisi bağlamında bahsedildiğinde nesnenin adı.
typedChildren Alt ilişkiden nesne döndürme yönteminin adı.
nullValue Altındaki değer DBNull ise değer. Ek açıklamalar için nullValue aşağıdaki tabloya bakın. Varsayılan değer _throw.

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

"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. Varsayılan değer budur.
_sıfır Null bir başvuru döndür veya ilkel bir türle karşılaşılırsa bir istisna fırlat.
_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, özel bir durum oluşturun.

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

Nesne/Yöntem/Olay Varsayılan Açıklama
DataTable TabloAdiVeriTablosu typedPlural
DataTable Yöntemler NewTableNameRow

TabloAdıSatırıEkle

TabloAdıSatırınıSil
yazılanAd
DataRowCollection Tablo Adı typedPlural
DataRow TabloAdıSatırı yazılanAd
DataColumn DataTable.ColumnNameColumn

DataRow.ColumnName
yazılanAd
Emlak ÖzellikAdı yazılanAd
Çocuk Erişim Sağlayıcı GetChildTableNameRows Tipli Çocuklar
Ebeveyn Erişimci TabloAdıSatırı TypedEbeveyn
DataSet Olaylar TabloAdıSatırDeğişimOlayı

TabloAdıSatırDeğişikliğiOlayİşleyici
yazılanAd

Yazılan DataSet ek açıklamaları kullanmak için XML Şema tanım dili (XSD) şemanıza aşağıdaki xmlns başvuruyu 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, Orders tablosuyla ilişkili olacak şekilde gösteren örnek bir 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ş güçlü şekilde tiplenmiş DataSet kullanır. Her bir tabloyu doldurmak için bir SqlDataAdapter kullanır ve diğer tabloyu doldurmak için de başka bir SqlDataAdapter kullanır. Kesin olarak yazılan , 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 bakınız