DataTable と DataColumn のマップの設定

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

workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors")
[C#]
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors");

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 テーブルにある、よりわかりやすい名前のセットに割り当てます。割り当てられない列には、データ ソースの列名が使用されます。

Dim custMap As DataTableMapping = custDA.TableMappings.Add("Table", "NorthwindCustomers")
custMap.ColumnMappings.Add( "CompanyName", "Company")
custMap.ColumnMappings.Add( "ContactName", "Contact")
custMap.ColumnMappings.Add( "PostalCode", "ZIPCode")

custDA.Fill(custDS)
[C#]
DataTableMapping custMap = custDA.TableMappings.Add("Table", "NorthwindCustomers");
custMap.ColumnMappings.Add( "CompanyName", "Company");
custMap.ColumnMappings.Add( "ContactName", "Contact");
custMap.ColumnMappings.Add( "PostalCode", "ZIPCode");

custDA.Fill(custDS);

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

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

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

Dim bizMap As ITableMapping = custDA.TableMappings.Add("Customers", "BizTalkSchema")
bizMap.ColumnMappings.Add( "CustomerID", "ClientID")
bizMap.ColumnMappings.Add( "CompanyName", "ClientName")
bizMap.ColumnMappings.Add( "ContactName", "Contact")
bizMap.ColumnMappings.Add( "PostalCode", "ZIP")

custDA.Fill(custDS, "Customers")
[C#]
ITableMapping bizMap = custDA.TableMappings.Add("Customers", "BizTalkSchema");
bizMap.ColumnMappings.Add( "CustomerID", "ClientID");
bizMap.ColumnMappings.Add( "CompanyName", "ClientName");
bizMap.ColumnMappings.Add( "ContactName", "Contact");
bizMap.ColumnMappings.Add( "PostalCode", "ZIP");

custDA.Fill(custDS, "Customers");

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

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

複数結果セット

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

custDA.Fill(custDS, "Customers")

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

custDA.TableMappings.Add("Customers1", "Orders")
custDA.Fill(custDS, "Customers")

参照

.NET Framework データ プロバイダによるデータのアクセス | DataSet クラス | DataTable クラス | DataTableCollection クラス | DataTableMappingCollection クラス | OleDbDataAdapter クラス | OdbcDataAdapter クラス | SqlDataAdapter クラス