Создание строго типизированных наборов данных

Учитывая xml-схему, которая соответствует стандарту языка определения схемы XML (XSD), можно создать строго типизированный DataSet с помощью средства XSD.exe, предоставленного пакетом средств разработки программного обеспечения Windows (SDK).

(Чтобы создать xsd из таблиц базы данных, см. WriteXmlSchema или Работа с наборами данных в Visual Studio).

В следующем коде показан синтаксис для создания DataSet с помощью этого средства.

xsd.exe /d /l:CS XSDSchemaFileName.xsd /eld /n:XSDSchema.Namespace

В этом синтаксисе /d директива сообщает средству создать набор данных, и /l: сообщает инструменту, какой язык следует использовать (например, C# или Visual Basic .NET). Необязательная /eld директива указывает, что для запроса к созданному набору данных можно использовать LINQ to DataSet. Этот параметр используется при указании /d параметра. Дополнительные сведения см. в разделе "Запросы типизированных наборов данных". Необязательная /n: директива сообщает средству также создать пространство имен для DataSet с названием XSDSchema.Namespace. Выходные данные команды XSDSchemaFileName.cs, которые можно скомпилировать и использовать в приложении ADO.NET. Созданный код можно скомпилировать как библиотеку или модуль.

В следующем коде показан синтаксис для компиляции созданного кода в виде библиотеки с помощью компилятора C# (csc.exe).

csc.exe /t:library XSDSchemaFileName.cs /r:System.dll /r:System.Data.dll

Директива /t: сообщает средству компилироваться в библиотеку, а /r: директивы указывают зависимые библиотеки, необходимые для компиляции. Выходные данные команды XSDSchemaFileName.dll, которые можно передать компилятору при компиляции приложения ADO.NET с директивой /r: .

В следующем коде показан синтаксис для доступа к пространству имен, переданному в XSD.exe в приложении ADO.NET.

Imports XSDSchema.Namespace
using XSDSchema.Namespace;

В следующем примере кода используется типизированный именованный DataSetCustomerDataSet для загрузки списка клиентов из Northwind базы данных. После загрузки данных с помощью Fill метода пример перебирает каждого клиента в таблице Customers с помощью типизированного объекта CustomersRow. Это обеспечивает прямой доступ к CustomerID столбцу, а не через DataColumnCollection.

Dim customers As CustomerDataSet= New CustomerDataSet()
Dim adapter As SqlDataAdapter New SqlDataAdapter( _
  "SELECT * FROM dbo.Customers;", _
  "Data Source=(local);Integrated " & _
  "Security=SSPI;Initial Catalog=Northwind")

adapter.Fill(customers, "Customers")

Dim customerRow As CustomerDataSet.CustomersRow
For Each customerRow In customers.Customers
  Console.WriteLine(customerRow.CustomerID)
Next
CustomerDataSet customers = new CustomerDataSet();
SqlDataAdapter adapter = new SqlDataAdapter(
  "SELECT * FROM dbo.Customers;",
  "Data Source=(local);Integrated " +
  "Security=SSPI;Initial Catalog=Northwind");

adapter.Fill(customers, "Customers");

foreach(CustomerDataSet.CustomersRow customerRow in customers.Customers)
  Console.WriteLine(customerRow.CustomerID);

Ниже приведена схема XML, используемая для примера:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="CustomerDataSet" 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">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

См. также