次の方法で共有


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 ステートメントで返された行を BizTalkSchemaDataTable に割り当てています。

// 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 から始まるインクリメンタル既定名 SourceColumnN が割り当てられます。

注意

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

Note

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

複数の結果セットの処理

SelectCommand が複数のテーブルを返す場合、FillDataSet 内のテーブルに対する、インクリメント値を含むテーブル名を自動的に生成します。これは、指定したテーブル名で開始し、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");

関連項目