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 メソッドを呼び出すときにスキーマ情報を取得することをお勧めします。