DataSetのスキーマ (テーブル、列、リレーション、制約) は、プログラムによって定義するか、FillのFillSchemaまたはDataAdapterメソッドによって作成するか、XML ドキュメントから読み込むことができます。
DataSetスキーマ情報を XML ドキュメントから読み込むには、ReadXmlSchema のInferXmlSchemaまたはDataSetメソッドを使用できます。
ReadXmlSchema を使用すると、XML スキーマ定義言語 (XSD) スキーマを含むドキュメント、またはインライン XML スキーマを含む XML ドキュメント DataSet スキーマ情報を読み込んだり推論したりできます。
InferXmlSchema を使用すると、指定した特定の XML 名前空間を無視しながら、XML ドキュメントからスキーマを推論できます。
注
Web サービスまたは XML シリアル化を使用して XSD コンストラクト (入れ子になったリレーションシップなど) を使用してメモリ内に作成されたDataSetを転送する場合、DataSetでのテーブルの順序は保持されない場合があります。 したがって、この場合、 DataSet の受信者はテーブルの順序に依存しないようにする必要があります。 ただし、転送される DataSet のスキーマがメモリ内に作成されるのではなく、XSD ファイルから読み取られた場合、テーブルの順序は常に保持されます。
ReadXmlSchema
データを読み込まずに XML ドキュメントから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 のスキーマのみを読み込むか推論しますが、ReadXmlのDataSet メソッドは、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 ドキュメントからスキーマを推論するようにに指示することもできます。
InferXmlSchemaは、ReadXmlとXmlReadMode (InferSchemaでデータを読み込み、スキーマを推論します) の両方と同様に機能し、読み取るドキュメントにインライン スキーマが含まれていない場合は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 メソッドとReadXmlメソッドの両方にXmlReadModeのInferSchemaを指定すると、ドキュメント内のすべての要素 (Categories、CategoryID、CategoryName、Description、Products、ProductID、ReorderLevel、Discontinued) のテーブルが作成されます。 (詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください)。ただし、より適切な構造は、CategoriesテーブルとProducts テーブルのみを作成し、 テーブルに CategoryID、Description、およびCategories列を作成し、 テーブルに ProductID、Discontinued、および Products 列を作成することです。 推論されたスキーマで 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");