Bagikan melalui


Membuat Anotasi Himpunan Data yang Diketik

Anotasi memungkinkan Anda untuk mengubah nama elemen dalam DataSet yang diketik tanpa mengubah skema yang mendasarinya. Memodifikasi nama elemen dalam skema yang mendasari akan menyebabkan DataSet yang diketik merujuk ke objek yang tidak ada di sumber data, serta kehilangan referensi ke objek yang ada di sumber data.

Dengan anotasi, Anda dapat mengkustomisasi nama objek di DataSet yang diketik dengan nama yang lebih bermakna, membuat kode lebih mudah dibaca dan DataSet yang diketik lebih mudah digunakan klien, sambil membiarkan skema yang mendasarinya tetap utuh. Misalnya, elemen skema berikut untuk tabel Pelanggan dari database Northwind akan menghasilkan nama objek DataRow dari CustomersRow dan DataRowCollection bernama Pelanggan.

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

Nama DataRowCollection dari Pelanggan bermakna dalam kode klien, tetapi nama DataRow dari CustomersRow menyesatkan karena merupakan objek tunggal. Selain itu, dalam skenario umum, objek akan dirujuk tanpa pengidentifikasi Baris dan sebagai gantinya hanya akan dirujuk sebagai objek Pelanggan. Solusinya adalah dengan membuat anotasi untuk skema dan mengidentifikasi nama baru untuk objek DataRow dan DataRowCollection. Berikut ini adalah versi beranotasi dari skema sebelumnya.

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

Menentukan nilai typedName dari Pelanggan akan menghasilkan nama objek DataRow dari Pelanggan. Menentukan nilai typedPlural dari Pelanggan mempertahankan nama DataRowCollection dari Pelanggan.

Tabel berikut menunjukkan anotasi yang tersedia untuk digunakan.

Anotasi Deskripsi
typedName Nama objek.
typedPlural Nama kumpulan objek.
typedParent Nama objek ketika dirujuk dalam hubungan induk.
typedChildren Nama metode untuk mengembalikan objek dari hubungan turunan.
nullValue Nilai jika nilai dasarnya adalah DBNull. Lihat tabel berikut untuk anotasi nullValue. Defaultnya adalah _throw.

Tabel berikut menunjukkan nilai yang dapat ditentukan untuk anotasi nullValue.

Nilai nullValue Deskripsi
Nilai Pengganti Tentukan nilai yang akan dikembalikan. Nilai yang dikembalikan harus cocok dengan jenis elemen. Misalnya, gunakan nullValue="0" untuk mengembalikan 0 untuk bidang bilangan bulat null.
_throw Tampilkan pengecualian. Ini adalah default.
_null Kembalikan referensi null atau tampilkan pengecualian jika ditemukan jenis primitif.
_empty Untuk string, kembalikan String.Empty, jika tidak, kembalikan objek yang dibuat dari konstruktor yang kosong. Jika ditemukan jenis primitif, tampilkan pengecualian.

Tabel berikut menunjukkan nilai default untuk objek dalam DataSet yang diketik dan anotasi yang tersedia.

Objek/Metode/Peristiwa Default Anotasi
DataTable TableNameDataTable typedPlural
Metode DataTable NewTableNameRow

AddTableNameRow

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

DataRow.ColumnName
typedName
Properti PropertyName typedName
Pengakses Turunan GetChildTableNameRows typedChildren
Pengakses Induk TableNameRow typedParent
Peristiwa DataSet TableNameRowChangeEvent

TableNameRowChangeEventHandler
typedName

Untuk menggunakan anotasi DataSet yang diketik, Anda harus menyertakan referensi xmlns berikut dalam skema bahasa definisi Skema XML (XSD). Untuk membuat xsd dari tabel database, lihat WriteXmlSchema atau Bekerja dengan DataSets di Visual Studio.

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

Berikut adalah contoh skema beranotasi yang mengekspos tabel Pelanggan dari database Northwind dengan kaitannya ke tabel Pesanan yang disertakan.

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

Contoh kode berikut menggunakan DataSet yang bersifat strongly typed, yang dibuat dari sampel skema. Ini menggunakan satu SqlDataAdapter untuk mengisi tabel Pelanggan dan SqlDataAdapter lain untuk mengisi tabel Pesanan. DataSet yangbersifat strongly typed mendefinisikan 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)  
    {  
  
    }  

Lihat juga