DataAdapter 数据表和 DataColumn 映射

DataAdapter 包含一个集合,该集合在其DataTableMapping属性中拥有零个或多个TableMappings对象。 A DataTableMapping 提供从针对数据源的查询返回的数据与 DataTable数据源之间的主映射。 DataAdapterFill 方法可以用 DataTableMapping 名称替代 DataTable 名称。 以下示例为Authors表创建一个名为AuthorsMappingDataTableMapping

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

通过 A DataTableMapping ,可以在 DataTable 中使用与数据库中不同的列名。 在更新表时,该 DataAdapter 映射用于匹配列。

如果在调用 FillUpdate 方法时未指定 TableNameDataTableMapping 名称,则 DataAdapter 查找名为“Table”的 DataTableMapping。 如果 DataTableMapping 不存在,DataTableTableName 则为 “Table”。 可以通过创建名称为“Table”的DataTableMapping来指定DataTableMapping的默认值。

下面的代码示例创建一个 DataTableMapping (从 System.Data.Common 命名空间),并将其命名为“Table”,使其成为指定 DataAdapter 的默认映射。 然后,该示例将查询结果 Customers (数据库表 Northwind )中的第一个表的列映射到 Northwind Customers 表中 DataSet的一组更易用的名称。 对于未映射的列,将使用数据源中的列名称。

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

以下示例创建一个DataTableMapping,名称为Customers,以及一个DataTable,名称为BizTalkSchema。 然后,该示例将 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开始依次获得默认递增名称,例如SourceColumn 如果未为表映射提供源表名称,则从 SourceTable 开始,将为表映射提供 N增量默认名称。

注意

建议避免对列映射的 SourceColumn 或表映射SourceTable 命名约定,因为提供的名称可能与 ColumnMappingCollection 中的现有默认列映射名称或表映射名称冲突。 如果提供的名称已经存在,将引发异常。

处理多个结果集

SelectCommand如果返回多个表,Fill将自动生成表名,这些表名在 DataSet 中伴随表的增量值生成,表名从指定表名 TableName1开始,依次为TableNameN等形式。 可以使用表映射将自动生成的表名称映射到要为 DataSet 中的表指定的名称。 例如,对于返回两个表 Orders,请使用以下调用来填充

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

DataSet 中创建两个表:CustomersCustomers1。 可以使用表映射来确保第二个表命名 Orders 而不是 Customers1。 为此,请将 Customers1 的源表映射到 DataSet订单”表,如以下示例所示。

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

另请参阅