Language

DataSet への既存の制約の追加

FillのDataAdapterメソッドは、データ ソースのテーブル列と行のみをDataSetに格納します。制約はデータ ソースによって一般的に設定されますが、Fill メソッドでは既定でこのスキーマ情報はDataSetに追加されません。 データ ソースから既存の主キー制約情報をDataSetに設定するには、FillSchema の メソッドを呼び出すか、MissingSchemaAction を呼び出す前にDataAdapterのAddWithKey プロパティをに設定します。 これにより、 DataSet の主キー制約にデータ ソースの主キー制約が反映されるようになります。 外部キー制約情報はインクルードされないため、「DataTable の制約」で示されているように明示的に作成する必要があります。

データを入力する前にスキーマ情報をDataSetに追加すると、主キー制約が DataTable 内の オブジェクトに確実に含められます。 その結果、 DataSet を埋める追加の呼び出しが行われると、主キー列の情報を使用して、データ ソースの新しい行と各 DataTable の現在の行が照合され、テーブル内の現在のデータがデータ ソースのデータで上書きされます。 スキーマ情報がないと、DataSet にデータ ソースからの新しい行が付け加えられ、重複行が発生します。

注

データ ソース内の列が自動インクリメント、FillSchema メソッド、または Fill のMissingSchemaActionを持つ メソッドとして識別された場合は、DataColumn プロパティが AutoIncrement に設定されたtrueが作成されます。 ただし、 AutoIncrementStep と AutoIncrementSeed の値を自分で設定する必要があります。 自動インクリメント列について詳しくは、「AutoIncrement 列の作成」をご覧ください。

FillSchemaを使用するか、MissingSchemaActionをAddWithKeyに設定するには、データ ソースで追加の処理を行って主キー列の情報を決定する必要があります。 この追加の処理によりパフォーマンスが低下する場合があります。 デザイン時に主キー情報がわかっている場合は、最適のパフォーマンスを得るために主キー列 (複数の場合もある) を明示的に指定することをお勧めします。 テーブルに関する主キー情報を明示的に設定する方法については、「主キーの定義」をご覧ください。

次のコード例は、DataSet を使用してスキーマ情報をに追加する方法を示しています。

Dim custDataSet As New DataSet()

custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers")
custAdapter.Fill(custDataSet, "Customers")
var custDataSet = new DataSet();

custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers");
custAdapter.Fill(custDataSet, "Customers");

次のコード例は、DataSet メソッドの MissingSchemaAction.AddWithKey プロパティを使用して、スキーマ情報をFillに追加する方法を示しています。

Dim custDataSet As New DataSet()

custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
custAdapter.Fill(custDataSet, "Customers")
var custDataSet = new DataSet();

custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
custAdapter.Fill(custDataSet, "Customers");

複数の結果セットの処理

DataAdapterが SelectCommand から返された複数の結果セットを検出すると、DataSet に複数のテーブルが作成されます。 テーブルには、"Table0" ではなく Table から始まる、Table の 0 から始まる増分既定の名前が付けられます。 テーブル名が FillSchema メソッドに引数として渡された場合、テーブルには、"TableName0" ではなく TableName で始まる、TableName の 0 から始まる増分名が与えられる。

注

複数の結果セットを返すコマンドに対してFillSchema オブジェクトのOleDbDataAdapter メソッドが呼び出されると、最初の結果セットのスキーマ情報のみが返されます。 OleDbDataAdapter を使用して複数の結果セットのスキーマ情報を返す場合は、MissingSchemaActionのAddWithKeyを指定し、Fill メソッドを呼び出すときにスキーマ情報を取得することをお勧めします。

関連項目