DataAdapter、DataTable、DataColumn のマッピング

適用対象: .NET Framework .NET .NET Standard

ADO.NET のダウンロード

SqlDataAdapterTableMappings プロパティには、0 個以上の DataTableMapping オブジェクトのコレクションが含まれます。 DataTableMapping はデータ ソースに対するクエリで返されたデータと DataTable の間の主要なマッピングを提供します。 DataTableMapping 名は、DataAdapterFill メソッドに DataTable 名の代わりとして渡すことができます。 Authors テーブルに対して AuthorsMapping という名前の DataTableMapping を作成する例を次に示します。

workAdapter.TableMappings.Add("AuthorsMapping", "Authors");

DataTableMapping を使用すると、DataTable 内でデータベースの列名とは異なる列名を使用できます。 DataAdapter では、テーブルの更新時にこのマップを使用して列が照合されます。

注意

DataAdapterFill メソッドまたは Update メソッドを呼び出すときに TableName または DataTableMapping 名を指定しなかった場合、DataAdapter では "Table" という名前の DataTableMapping が検索されます。 その DataTableMapping が存在しない場合は、DataTableTableName が "Table" になります。 "Table" という名前の DataTableMapping を作成することで既定の DataTableMapping を指定できます。

次に示すのは、System.Data.Common 名前空間から DataTableMapping を作成し、それに "Table" という名前を付けて、指定した DataAdapter の既定のマップとして設定するコード サンプルです。 この例では、その後、クエリ結果の最初のテーブル (Northwind データベースの Customers テーブル) の列を DataSetNorthwind Customers テーブルにある、よりわかりやすい名前のセットに割り当てます。 割り当てられない列には、データ ソースの列名が使用されます。

// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();

SqlDataAdapter custAdapter = new SqlDataAdapter(
    "SELECT * FROM dbo.Customers", connection);

DataTableMapping mapping =
    custAdapter.TableMappings.Add("Table", "NorthwindCustomers");
mapping.ColumnMappings.Add("CompanyName", "Company");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");

custAdapter.Fill(custDataSet);

より高度な条件下では、同じ DataAdapter を使用して複数の割り当てが設定された複数テーブルの読み込みのサポートが必要な場合があります。 これを行うには、DataTableMapping オブジェクトを追加します。

Fill メソッドに DataSet のインスタンスと DataTableMapping 名が渡されたとき、その名前の割り当てが存在する場合はその名前が使用され、存在しない場合はその名前の DataTable が使用されます。

次に示すのは、Customers という名前と BizTalkSchema という DataTable 名を持つ DataTableMapping を作成する例です。 この例では、その後で、SELECT ステートメントで返された行を BizTalkSchema DataTable に割り当てています。

// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();

SqlDataAdapter custAdapter = new SqlDataAdapter(
    "SELECT * FROM dbo.Customers", connection);

// The DataTableMapping is implemented ITableMapping.
ITableMapping mapping =
    custAdapter.TableMappings.Add("Table", "BizTalkSchema");
mapping.ColumnMappings.Add("CustomerID", "ClientID");
mapping.ColumnMappings.Add("CompanyName", "ClientName");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIP");

custAdapter.Fill(custDataSet);

Note

列マッピングにソース列名が指定されていない場合、既定の名前が自動的に生成されます。 列マッピングにソース列を指定しなかった場合は、列マッピングに SourceColumn1 から始まるインクリメンタル既定名 SourceColumn N が割り当てられます。

Note

テーブル マッピングにソース テーブル名が指定されていない場合、既定の名前が自動的に生成されます。 テーブル マッピングにソース テーブル名を指定しなかった場合は、テーブル マッピングに SourceTable1 から始まるインクリメンタル既定名 SourceTable N が割り当てられます。

Note

列マップには、SourceColumnN の命名規則を使用しないこと、また、テーブルの割り当てには SourceTableN を使用しないことをお勧めします。これは、指定した名前が ColumnMappingCollection 内の既存する既定の列マップ名または DataTableMappingCollection 内のテーブル マップ名と競合しないようにするためです。 指定した名前が既に存在する場合は、例外がスローされます。

複数の結果セットの処理

SelectCommand で複数のテーブルが返される場合、Fill では DataSet 内のテーブルに対する、インクリメント値を含むテーブル名が自動的に生成されます。これは、指定したテーブル名で開始し、TableNameN の形式で TableName1 から数値を加算していく名前になります。 自動的に生成されたテーブル名は、テーブルの割り当てを使用して DataSet 内でテーブルに指定する名前に変換できます。 たとえば、Customers および Orders という 2 つのテーブルを返す SelectCommand に対して、次の Fill 呼び出しを実行します。

adapter.Fill(customersDataSet, "Customers");

DataSet には、次の 2 つのテーブルが作成されます: CustomersCustomers1。 テーブル マップを使用して、2 つ目のテーブルに Customers1 という名前の代わりに Orders という名前を付けることができます。 それには、次の例に示すように、ソース テーブル Customers1DataSet テーブルの Orders に割り当てます。

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT * FROM dbo.Customers; SELECT * FROM dbo.Orders;";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customersDataSet = new DataSet();

adapter.TableMappings.Add("Customers1", "Orders");
adapter.Fill(customersDataSet, "Customers");

関連項目