DataAdapter DataTable と DataColumn のマップ (ADO.NET)
DataAdapter は、TableMappings プロパティに 0 個以上の DataTableMapping オブジェクトのコレクションを持っています。 DataTableMapping はデータ ソースに対するクエリで返されたデータと DataTable の間のマスターのマップを提供します。 DataTableMapping 名は、DataAdapter の Fill メソッドに DataTable 名の代わりとして渡すことができます。 Authors テーブルに対して AuthorsMapping という名前の DataTableMapping を作成する例を次に示します。
workAdapter.TableMappings.Add("AuthorsMapping", "Authors")
workAdapter.TableMappings.Add("AuthorsMapping", "Authors");
DataTableMapping を使用すると、DataTable 内でデータベースの列名とは異なる列名を使用できます。 DataAdapter はテーブルの更新時にこのマップを使用して列を一致させます。
DataAdapter の Fill メソッドまたは Update メソッドを呼び出すときに TableName または DataTableMapping 名を指定しなかった場合、DataAdapter は "Table" という名前の DataTableMapping を検索します。 その DataTableMapping が存在しない場合は、DataTable の TableName が "Table" になります。 "Table" という名前の DataTableMapping を作成することで既定の DataTableMapping を指定できます。
次に示すのは、System.Data.Common 名前空間から DataTableMapping を作成し、それに "Table" という名前を付けて、指定した DataAdapter の既定のマップとして設定するコード サンプルです。 この例では、その後、クエリ結果の最初のテーブル (Northwind データベースの Customers テーブル) の列を DataSet の Northwind 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 ステートメントで返された行を BizTalkSchema DataTable に割り当てています。
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");
メモ |
---|
列マップにソースの列名を指定しなかった場合、またはテーブル マップにソース テーブル名を指定しなかった場合は、自動的に既定の名前が生成されます。列マップにソース列を指定しなかった場合は、列マップに SourceColumn1 から始まるインクリメンタル既定名 SourceColumnN が割り当てられます。テーブル マップにソース テーブル名を指定しなかった場合は、テーブル マップに SourceTable1 から始まるインクリメンタル既定名 SourceTableN が割り当てられます。 |
メモ |
---|
列マップには、SourceColumnN の命名規則を使用しないこと、また、テーブルの割り当てには SourceTableN を使用しないことをお勧めします。これは、指定した名前が ColumnMappingCollection 内の既存する既定の列マップ名または DataTableMappingCollection 内のテーブル マップ名と競合しないようにするためです。指定した名前が既に存在する場合は、例外がスローされます。 |
複数の結果セットの処理
SelectCommand が複数のテーブルを返す場合、Fill は DataSet 内のテーブルに対する、インクリメント値を含むテーブル名を自動的に生成します。これは、指定したテーブル名で開始し、TableNameN の形式で TableName1 から数値を加算していく名前になります。 自動的に生成されたテーブル名は、テーブルの割り当てを使用して DataSet 内でテーブルに指定する名前に変換できます。 たとえば、Customers および Orders という 2 つのテーブルを返す SelectCommand に対して、次の Fill 呼び出しを実行します。
adapter.Fill(customersDataSet, "Customers")
DataSet 内に Customers および Customers1 という 2 つのテーブルが作成されます。 テーブル マップを使用して、2 つ目のテーブルに Customers1 という名前の代わりに Orders という名前を付けることができます。 それには、次の例に示すように、ソース テーブル Customers1 を DataSet テーブル Orders に割り当てます。
adapter.TableMappings.Add("Customers1", "Orders")
adapter.Fill(customersDataSet, "Customers")