DataSetのスキーマ (そのテーブル、列、リレーション、制約) は、プログラムによって定義するか、の Fill メソッドまたは FillSchema メソッドによって作成するか、XML ドキュメントから読み込むことができます。DataAdapter XML ドキュメントから DataSet スキーマ情報を読み込むには、 DataSet の ReadXmlSchema メソッドまたは InferXmlSchema メソッドを使用 できます。 ReadXmlSchema を使用すると、XML スキーマ定義言語 (XSD) スキーマを含むドキュメント、またはインライン XML スキーマを含む XML ドキュメントから DataSet スキーマ情報を読み込んだり推論したりできます。 InferXmlSchema を使用すると、指定した特定の XML 名前空間を無視しながら、XML ドキュメントからスキーマを推論できます。
注
Web サービスまたは XML シリアル化を使用して XSD コンストラクト (入れ子になったリレーションシップなど) を使用してメモリ内に作成された DataSet を転送する場合、DataSet 内のテーブルの順序は保持されない場合があります。 したがって、この場合、 DataSet の受信者はテーブルの順序に依存しないでください。 ただし、転送される DataSet のスキーマがメモリ内に作成されるのではなく、XSD ファイルから読み取られた場合、テーブルの順序は常に保持されます。
ReadXmlSchema
データを読み込まずに XML ドキュメントから DataSet のスキーマを読み込むには、DataSet の ReadXmlSchema メソッドを使用できます。 ReadXmlSchema は、XML スキーマ定義言語 (XSD) スキーマを使用して定義された DataSet スキーマを作成します。
ReadXmlSchema メソッドは、読み込む XML ドキュメントを含むファイル名、ストリーム、または XmlReader の 1 つの引数を受け取ります。 XML ドキュメントにはスキーマのみを含めることができます。また、データを含む XML 要素と共にインラインでスキーマを含めることもできます。 インライン スキーマを XML スキーマとして記述する方法の詳細については、「XML スキーマ (XSD) からの DataSet リレーショナル構造の派生」を参照してください。
ReadXmlSchema に渡される XML ドキュメントにインライン スキーマ情報が含まれていない場合、ReadXmlSchema は XML ドキュメント内の要素からスキーマを推論します。 DataSet に既にスキーマが含まれている場合、新しいテーブルがまだ存在しない場合は、新しいテーブルを追加することで現在のスキーマが拡張されます。 新しい列は既存のテーブルに追加されません。 追加される列が 既に DataSet に存在するが、XML で見つかった列と互換性のない型を持つ場合は、例外がスローされます。 ReadXmlSchema が XML ドキュメントからスキーマを推論する方法の詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください。
ReadXmlSchema は DataSet のスキーマのみを読み込むか推論しますが、DataSet の ReadXml メソッドは、XML ドキュメントに含まれるスキーマとデータの両方を読み込んだり推論したりします。 詳細については、「 XML からの DataSet の読み込み」を参照してください。
次のコード例は、XML ドキュメントまたはストリームから DataSet スキーマを読み込む方法を示しています。 最初の例は、 ReadXmlSchema メソッドに渡される XML スキーマ ファイル名を示しています。 2 番目の例は 、System.IO.StreamReader を示しています。
Dim dataSet As DataSet = New DataSet
dataSet.ReadXmlSchema("schema.xsd")
DataSet dataSet = new DataSet();
dataSet.ReadXmlSchema("schema.xsd");
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet
dataSet.ReadXmlSchema(xmlStream)
xmlStream.Close()
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");
DataSet dataSet = new DataSet();
dataSet.ReadXmlSchema(xmlStream);
xmlStream.Close();
InferXmlSchema
DataSet の InferXmlSchema メソッドを使用して、XML ドキュメントからスキーマを推論するように DataSet に指示することもできます。 InferXmlSchema は、InferSchema の XmlReadMode (データの読み込みとスキーマの推論) を使用した ReadXml と、読み取られるドキュメントにインライン スキーマが含まれない場合の ReadXmlSchema の両方と同じように機能します。 ただし、 InferXmlSchema には、スキーマの推論時に無視する特定の XML 名前空間を指定できる追加機能が用意されています。 InferXmlSchema は、ファイル名、ストリーム、または XmlReader で指定された XML ドキュメントの場所という 2 つの必須引数を受け取ります。および操作によって無視される XML 名前空間の文字列配列。
たとえば、次の XML を考えてみましょう。
<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">
<Categories>
<CategoryID od:adotype="3">1</CategoryID>
<CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
<Description od:adotype="203">Soft drinks and teas</Description>
</Categories>
<Products>
<ProductID od:adotype="20">1</ProductID>
<ReorderLevel od:adotype="3">10</ReorderLevel>
<Discontinued od:adotype="11">0</Discontinued>
</Products>
</NewDataSet>
上記の XML ドキュメント内の要素に指定された属性のため、ReadXmlSchema メソッドと InferSchema の XmlReadMode を持つ ReadXml メソッドの両方で、ドキュメント内のすべての要素 (Categories、CategoryID、CategoryName、Description、Products、ProductID、ReorderLevel、Discontinued) のテーブルが作成されます。 (詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください)。ただし、より適切な構造は、Categories テーブルと Products テーブルのみを作成し、Categories テーブルに CategoryID、CategoryName、Description 列を作成し、Products テーブルに ProductID、ReorderLevel、および Discontinued 列を作成することです。 推論されたスキーマで XML 要素で指定された属性が無視されるようにするには、 InferXmlSchema メソッドを使用し、無視する officedata の XML 名前空間を次の例に示すように指定します。
Dim dataSet As DataSet = New DataSet
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})
DataSet dataSet = new DataSet();
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");