DataAdapter DataTable と DataColumn のマップ

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

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

Dim mapping As DataTableMapping = _  
  adapter.TableMappings.Add("Table", "NorthwindCustomers")  
mapping.ColumnMappings.Add("CompanyName", "Company")  
mapping.ColumnMappings.Add("ContactName", "Contact")  
mapping.ColumnMappings.Add("PostalCode", "ZIPCode")  
  
adapter.Fill(custDS)  
DataTableMapping mapping =
  adapter.TableMappings.Add("Table", "NorthwindCustomers");  
mapping.ColumnMappings.Add("CompanyName", "Company");  
mapping.ColumnMappings.Add("ContactName", "Contact");  
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");  
  
adapter.Fill(custDS);  

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

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

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

Dim mapping As ITableMapping = _  
  adapter.TableMappings.Add("Customers", "BizTalkSchema")  
mapping.ColumnMappings.Add("CustomerID", "ClientID")  
mapping.ColumnMappings.Add("CompanyName", "ClientName")  
mapping.ColumnMappings.Add("ContactName", "Contact")  
mapping.ColumnMappings.Add("PostalCode", "ZIP")  
  
adapter.Fill(custDS, "Customers")  
ITableMapping mapping =
  adapter.TableMappings.Add("Customers", "BizTalkSchema");  
mapping.ColumnMappings.Add("CustomerID", "ClientID");  
mapping.ColumnMappings.Add("CompanyName", "ClientName");  
mapping.ColumnMappings.Add("ContactName", "Contact");  
mapping.ColumnMappings.Add("PostalCode", "ZIP");  
  
adapter.Fill(custDS, "Customers");  

Note

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

Note

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

複数の結果セットの処理

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

adapter.Fill(customersDataSet, "Customers")  
adapter.Fill(customersDataSet, "Customers");  

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

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

関連項目