DataAdapter、DataTable 與 DataColumn 對應

適用於: .NET Framework .NET .NET 標準

下載 ADO.NET

SqlDataAdapter 在 DataTableMapping 屬性中包含零個或以上 TableMappings 物件的集合。 DataTableMapping 提供對資料來源執行查詢所傳回的資料與 DataTable 之間的主要對應。 您可將 DataTableMapping 名稱傳遞給 DataAdapter 的 Fill 方法,以取代 DataTable 名稱。 下列範例會為 Authors 資料表建立名為 AuthorsMapping 的 DataTableMapping。

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

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 資料表內一組更方便使用的名稱。 對於未對應的資料行,會使用資料來源中的資料行名稱。

// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();

SqlDataAdapter custAdapter = new SqlDataAdapter(
    "SELECT * FROM dbo.Customers", connection);

DataTableMapping mapping =
    custAdapter.TableMappings.Add("Table", "NorthwindCustomers");
mapping.ColumnMappings.Add("CompanyName", "Company");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");

custAdapter.Fill(custDataSet);

在更為進階的情況中,您可能決定要以同一個 DataAdapter 載入具有不同對應的不同資料表。 您只要另外加上 DataTableMapping 物件即可完成這項作業。

當系統將一個 DataSet 執行個體和一個 DataTableMapping 名稱傳入 Fill 方法時,如果存在具有該名稱的對應,則會使用該對應;否則,會使用具有該名稱的 DataTable。

下列範例使用 Customers 名稱建立 DataTableMapping,並以 BizTalkSchema 名稱建立 DataTable。 接著,範例將 SELECT 陳述式傳回的資料列對應至 BizTalkSchemaDataTable。

// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();

SqlDataAdapter custAdapter = new SqlDataAdapter(
    "SELECT * FROM dbo.Customers", connection);

// The DataTableMapping is implemented ITableMapping.
ITableMapping mapping =
    custAdapter.TableMappings.Add("Table", "BizTalkSchema");
mapping.ColumnMappings.Add("CustomerID", "ClientID");
mapping.ColumnMappings.Add("CompanyName", "ClientName");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIP");

custAdapter.Fill(custDataSet);

注意

若未為資料行對應提供來源資料行名稱,系統將自動產生預設名稱。 如果不為資料行對應提供來源資料行,則資料行對應會被指定 SourceColumnN 的遞增預設名稱,並從 SourceColumn1 開始。

注意

如果未提供資料表對應的來源資料表名稱,則會自動產生預設的名稱。 如果不為資料表對應提供來源資料表,則資料表對應會被指定 SourceTableN 的遞增預設名稱,並從 SourceTable1 開始。

注意

若為資料行對應,我們建議您避免命名慣例 SourceColumnN;若為資料表對應,我們建議您避免命名慣例 SourceTableN,因為您提供的名稱,可能與 ColumnMappingCollection 中的現有預設資料行對應名稱發生衝突,或與 DataTableMappingCollection 中的資料表對應名稱衝突。 如果指定的名稱已存在,將會擲回例外。

處理多個結果集

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

adapter.Fill(customersDataSet, "Customers");

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

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT * FROM dbo.Customers; SELECT * FROM dbo.Orders;";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customersDataSet = new DataSet();

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