DataSet への既存の制約の追加

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

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

Note

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

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

次のコード例では、FillSchema を使用して 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");  

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

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 に複数のテーブルが作成されます。 これらのテーブルには、0 から始まるインクリメンタル既定名 TableN が割り当てられます。したがって "Table0" ではなく、Table から始まります。 テーブル名が FillSchema メソッドに引数として渡されると、0 からから始まるインクリメンタル名 TableNameN が割り当てられます。ここでは、"TableName0" ではなく TableName から始まります。

Note

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

関連項目