DataAdapter DataTable 和 DataColumn 對應

DataAdapterTableMappings 屬性包含零或多個 DataTableMapping 物件的集合。 DataTableMapping 提供查詢資料來源所傳回的資料與 DataTable 之間的主要對應。 您可傳遞 DataTableMapping 名稱,將 DataTable 名稱取代為 DataAdapterFill 方法。 下列範例為 Authors 資料表建立名為 AuthorsMappingDataTableMapping

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

DataTableMapping 可讓您在 DataTable 中使用與資料庫中不同的資料行名稱。 資料表更新後,DataAdapter 便使用對應來比對資料行。

若未指定 TableNameDataTableMapping 名稱就呼叫 DataAdapterFillUpdate 方法,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 物件即可完成這項作業。

當您將 DataSet 的執行個體和 DataTableMapping 名稱傳遞給 Fill 方法時,除非使用具有該名稱的對應,否則便會使用具有這個名稱的 DataTable

下列範例使用 Customers 名稱建立 DataTableMapping,並以 BizTalkSchema 名稱建立 DataTable。 接著,此範例會將 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");  

注意

若未提供來源資料行名稱給資料行對應,或是未提供來源資料表名稱給資料表對應,便會自動產生預設名稱。 如果沒有來源資料行提供給資料行對應,該資料行對應會指定 SourceColumnN 的遞增預設名稱,從 SourceColumn1 開始。 如果沒有來源資料表提供給資料表對應,該資料表對應會指定 SourceTableN 的遞增預設名稱,從 SourceTable1 開始。

注意

資料行對應建議避免使用 SourceColumnN 的命名慣例,或資料表對應避免 SourceTableN 的命名慣例,因為您提供的名稱,可能會與 ColumnMappingCollection 中的現有預設資料行對應名稱,或 DataTableMappingCollection 中的資料表對應名稱發生衝突。 如果提供的名稱已經存在,便會擲回例外狀況。

處理多重結果集

如果您的 SelectCommand 傳回多份資料表,Fill 會自動為 DataSet 中的資料表產生遞增值資料表名稱,從指定的資料表名稱開始,以 TableName1 開始的 TableNameN 格式繼續。 您可以使用資料表對應,將自動產生的資料表名稱對應至您要指定給 DataSet 內資料表的名稱。 例如,如果是針對傳回兩個資料表 CustomersOrdersSelectCommand,請對 Fill 發出下列呼叫。

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

這兩個資料表建立於 DataSet 中:CustomersCustomers1。 您可以使用資料對應來確保第二個資料表名為 Orders,而不是 Customers1。 若要執行這項作業,請將來源資料表 Customers1 對應至 DataSet 資料表 Orders,如下列範例所示。

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

請參閱