주석을 사용하면 기본 스키마를 수정하지 않고도 형식화된 DataSet 요소의 이름을 수정할 수 있습니다. 기본 스키마에서 요소의 이름을 수정하면 형식화된 DataSet 개체가 데이터 원본에 존재하지 않는 개체를 참조하고 데이터 원본에 있는 개체에 대한 참조가 손실됩니다.
주석을 사용하여 보다 의미 있는 이름으로 형식화된 DataSet 개체의 이름을 사용자 지정할 수 있으므로 기본 스키마를 그대로 유지하면서 코드를 더 읽기 쉽고 DataSet 클라이언트에서 사용하기 쉽게 만들 수 있습니다. 예를 들어 Northwind 데이터베이스의 Customers 테이블에 대한 다음 스키마 요소는 CustomersRow이라는 DataRow 개체 이름과 Customers라는 DataRowCollection을 생성하게 됩니다.
<xs:element name="Customers">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
DataRowCollection 이름은 Customers 클라이언트 코드에서 의미가 있지만, DataRow 이름은 단일 객체이므로 헷갈릴 수 있습니다. 일반적인 시나리오에서는 개체가 식별자 없이 Row로 참조되며, 대신 단순히 Customer 개체라고 불립니다. 해결 방법은 스키마에 주석을 달고 DataRow 및 DataRowCollection 개체에 대한 새 이름을 식별하는 것입니다. 다음은 이전 스키마의 주석이 추가된 버전입니다.
<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>
typedName 값을 Customer로 지정하면 결과적으로 DataRow 개체 이름이 Customer가 됩니다.
typedPlural 값을 Customers로 지정하면 DataRowCollection 이름이 Customers로 유지됩니다.
다음 표에서는 사용할 수 있는 주석을 보여 줍니다.
| 주석 | 설명 |
|---|---|
| typedName | 개체의 이름입니다. |
| typedPlural | 개체 컬렉션의 이름입니다. |
| typedParent | 부모 관계에서 참조되는 개체의 이름입니다. |
| typedChildren | 자식 관계에서 개체를 반환하는 메서드의 이름은 무엇입니까? |
| nullValue | 기본 값이 DBNull이면 값입니다. 다음 표에서 nullValue 주석을 참조하세요. 기본값은 _throw. |
다음 표에서는 주석에 대해 지정할 nullValue 수 있는 값을 보여줍니다.
| "nullValue" 값 | 설명 |
|---|---|
| 대체 값 | 반환할 값을 지정합니다. 반환된 값은 요소의 형식과 일치해야 합니다. 예를 들어 null 정수 필드에 대해 0을 반환하는 데 사용합니다 nullValue="0" . |
| _던지다 | 예외를 발생시킵니다. 기본값입니다. |
| _영 | 기본 형식이 발견되면 null 참조를 반환하거나 예외를 발생시킵니다. |
| _비우다 | 문자열의 경우 String.Empty를 반환하고, 그렇지 않으면 빈 생성자에서 만든 개체를 반환합니다. 기본 형식이 발견되면 예외를 발생시킵니다. |
다음 표에서는 형식화된 DataSet 개체의 기본값과 사용 가능한 주석을 보여 줍니다.
| 객체/메서드/이벤트 | 기본값 | 주석 |
|---|---|---|
| DataTable | 테이블이름데이터테이블 TableNameDataTable | typedPlural |
| DataTable 방법 | 새 테이블 이름 행 테이블이름행추가 테이블명 행 삭제 |
입력된 이름 |
| DataRowCollection | 테이블명 | typedPlural |
| DataRow | 테이블이름행 | 입력된 이름 |
| DataColumn | DataTable.ColumnNameColumn DataRow.ColumnName |
입력된 이름 |
| 재산 | 속성명 | 입력된 이름 |
| 아이 접근자 | 자식 테이블 이름 행 가져오기 | 타입화된 자식들 |
| 부모 접근자 | 테이블이름행 | 입력된부모 |
| DataSet 이벤트 | 테이블이름행변경이벤트 테이블이름행변경이벤트핸들러 |
입력된 이름 |
형식화된 DataSet 주석을 사용하려면 XSD(XML 스키마 정의 언어) 스키마에 다음 xmlns 참조를 포함해야 합니다. 데이터베이스 테이블에서 xsd를 만들려면 WriteXmlSchema 또는 Visual Studio에서의 데이터 세트 작업을 참조하십시오.
xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"
다음은 Orders 테이블이 포함된 Northwind 데이터베이스의 Customers 테이블을 노출하는 관계가 주석으로 추가된 샘플 스키마입니다.
<?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>
다음 코드 예제에서는 샘플 스키마에서 만든 강력한 형식 DataSet 을 사용합니다. 하나는 SqlDataAdapter 테이블을 채우고 다른 하나는 SqlDataAdapter를 사용하여 Orders 테이블을 채웁니다. 강력한 형식의 DataSet가 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)
{
}