DataSet への既存の制約の追加
DataAdapter の Fill メソッドは、DataSet にデータ ソースからのテーブルの列および行だけを格納します。制約は一般にデータ ソースで設定されますが、既定では Fill メソッドは DataSet にこのスキーマ情報を追加しません。データ ソースからの既存の主キー制約情報を DataSet に設定するには、DataAdapter の FillSchema メソッドを呼び出すか、または Fill を呼び出す前に DataAdapter の MissingSchemaAction プロパティを AddWithKey に設定します。これにより、データ ソースの主キー制約が DataSet の主キー制約に反映されます。外部キー制約情報は取り込まれないため、「テーブルへの制約の追加」で示すように明示的に作成する必要があります。
DataSet 内にデータを格納する前にスキーマ情報を追加すると、主キー制約が DataSet 内の DataTable オブジェクトに取り込まれます。その結果、DataSet に対して格納を行う追加の Fill を呼び出したとき、その主キー列情報を使用してデータ ソースから得られた新しい行と各 DataTable の現在の行を一致させ、各テーブルの現在のデータをデータ ソースのデータで上書きします。スキーマ情報がないと、DataSet にデータ ソースからの新しい行が付け加えられ、重複行が発生します。
メモ データ ソースの列を自動インクリメント列として指定した場合は、FillSchema メソッド (MissingSchemaAction を AddWithKey に設定した Fill メソッド) が、AutoIncrement プロパティを true に設定した DataColumn を作成します。ただし、AutoIncrementStep 値と AutoIncrementSeed 値は明示的に設定する必要があります。自動インクリメント列の詳細については、「AutoIncrement 列の作成」を参照してください。
FillSchema の使用や MissingSchemaAction の設定を AddWithKey にする場合、データ ソースで主キー列情報を確認するための追加の処理が必要になります。この追加の処理によりパフォーマンスが低下する場合があります。デザイン時に主キー情報がわかっている場合は、最適のパフォーマンスを得るために主キー列 (複数の場合もある) を明示的に指定することをお勧めします。テーブルに関する主キー情報を明示的に設定する方法については、「テーブルの主キーの定義」を参照してください。
FillSchema を使用して DataSet にスキーマ情報を追加する方法を次のサンプル コードに示します。
Dim custDS As DataSet = New DataSet()
custDA.FillSchema(custDS, SchemaType.Source, "Customers")
custDA.Fill(custDS, "Customers")
[C#]
DataSet custDS = new DataSet();
custDA.FillSchema(custDS, SchemaType.Source, "Customers");
custDA.Fill(custDS, "Customers");
Fill メソッドの MissingSchemaAction.AddWithKey プロパティを使用してスキーマ情報を DataSet に追加する方法を次のサンプル コードに示します。
Dim custDS As DataSet = New DataSet()
custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
custDA.Fill(custDS, "Customers")
[C#]
DataSet custDS = new DataSet();
custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
custDA.Fill(custDS, "Customers");
複数結果セット
DataAdapter は、SelectCommand から返された複数の結果セットを検出すると DataSet に複数のテーブルを作成します。これらのテーブルには、Table0 のように、"Table" で始まるインクリメンタル既定名 TableN が割り当てられます。テーブル名が FillSchema メソッドに引数として渡されると、TableName0 を表す "TableName" から始まるインクリメンタル既定名 TableNameN が割り当てられます。
メモ OleDbDataAdapter オブジェクトの FillSchema メソッドが複数の結果セットを返すコマンドとして呼び出された場合は、最初の結果セットのスキーマ情報が返されます。OleDbDataAdapter を使用して複数の結果セットのスキーマ情報を返すときは、Fill メソッドを呼び出すときに AddWithKey に設定した MissingSchemaAction を指定してスキーマ情報を取得することをお勧めします。