DataAdapter 在其 TableMappings 属性中包含零个或更多个 DataTableMapping 对象的集合。DataTableMapping 提供对数据源的查询所返回的数据与 DataTable 之间的主映射。DataTableMapping 名称可以代替 DataTable 名称传递到 DataAdapter 的 Fill 方法。以下示例为 MyAuthors 表创建名为 AuthorsMapping 的 DataTableMapping。
[Visual Basic]
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors")
[C#]
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors");
DataTableMapping 使您能够使用 DataTable 中与数据库中的列名不同的列名。当该表被更新时,DataAdapter 将使用此映射来匹配列。
如果在调用 DataAdapter 的 Fill 或 Update 方法时未指定 TableName 或 DataTableMapping 名称,DataAdapter 将查找名为“Table”的 DataTableMapping。如果 DataTableMapping 不存在,DataTable 的 TableName 将为“Table”。可以通过创建名为“Table”的 DataTableMapping 来指定默认的 DataTableMapping。
以下代码示例创建一个 DataTableMapping(从 System.Data.Common 命名空间)并通过将其命名为“Table”来使其成为指定 DataAdapter 的默认映射。然后,该示例将查询结果中第一个表(Northwind 数据库的 Customers 表)中的列映射到 DataSet 的 Northwind Customers 表中的一组更为用户友好的名称。对于未映射的列,将使用数据源中的列名称。
[Visual Basic]
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 而 DataTable 名称为 BizTalkSchema 的 DataTableMapping。然后,该示例将 SELECT 语句所返回的行映射到 BizTalkSchema DataTable。
[Visual Basic]
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");
注意 如果没有为列映射提供源列名称或者没有为表映射提供源表名称,则将自动生成默认名称。如果没有为列映射提供源列,则将给列映射提供递增的默认名称 SourceColumnN,这些名称从“SourceColumn1”开始。如果没有为表映射提供源表名称,则将给该表映射提供递增的默认名称 SourceTableN,这些名称从“SourceTable1”开始。
建议在为列映射提供源列名称时避免使用“SourceColumnN”命名约定,在为表映射提供源表名称时避免使用“SourceTableN”命名约定,因为所提供的名称可能会与 ColumnMappingCollection 中现有的默认列映射名称或 DataTableMappingCollection 中的表映射名称发生冲突。如果提供的名称已经存在,将引发异常。
多个结果集
如果 SelectCommand 返回多个表,Fill 将自动使用递增值为 DataSet 中的表生成表名称,这些表名称从指定表名称开始,并以 TableNameN 格式(从“TableName1”开始)继续。可以使用表映射将自动生成的表名称映射到要为 DataSet 中的表指定的名称。例如,对于返回两个表(Customers 和 Orders)的 SelectCommand,可对 Fill 发出以下调用。
custDA.Fill(custDS, "Customers")
在 DataSet 中创建了两个表:Customers 和 Customers1。可以使用表映射来确保第二个表名为 Orders 而不是 Customers1。若要完成此任务,请将 Customers1 的源表映射到 DataSet 表 Orders,如以下示例所示。
custDA.TableMappings.Add("Customers1", "Orders")
custDA.Fill(custDS, "Customers")