TableAdapter 概觀

 

發行︰ 2016年4月

TableAdapter 提供應用程式與資料庫之間的通訊。 更確切地說,TableAdapter 會連接到資料庫、執行查詢或預存程序,然後傳回一個已填入傳回之資料的新資料表,或是將傳回的資料填入現有的 DataTable。 TableAdapter 也可用來將應用程式中的更新之資料傳回到資料庫。

使用舊版的 Visual Studio 可以將 TableAdapter 視為具有內建連接物件及包含多個查詢之能力的 DataAdapter。 每一個加入到 TableAdapter 中的查詢會公開為公用方法,此方法的呼叫方式與物件上的任何其他方法或函式一樣。

除了 DataAdapter 的標準功能,TableAdapter 還提供額外型別方法,這些方法會將與關聯型別 DataTable 共用結構描述的多個查詢一起封裝。 換句話說,您在 TableAdapter 上可以盡量有多一點的查詢,只要這些查詢所傳回的資料符合相同的結構描述即可。

在舊版的 Visual Studio 中,ADO.NET 資料配接器是用於應用程式和資料庫之間的通訊。 雖然資料配接器仍然是 .NET Framework 資料提供者 的主要元件,但 TableAdapter 是設計工具產生的元件,可提升 DataAdapter 的功能。 TableAdapter 一般會包含 FillUpdate 方法,以擷取和更新資料庫中的資料。

TableAdapter 是以 [DataSet 設計工具] 在強型別資料集內建立。 在建立新資料集時,您可以使用資料來源組態精靈建立 TableAdapter。 您也可以在現有資料集中使用 TableAdapter 組態精靈,或將資料庫物件從 [伺服器總管] 拖曳至 [DataSet 設計工具],以建立 TableAdapter。 如需詳細資訊,請參閱如何:建立 TableAdapter

雖然 TableAdapter 是以 [DataSet 設計工具] 所設計,但產生的 TableAdapter 類別不是 DataSet 的巢狀類別。 它們位於每個資料集特定的個別命名空間中。 例如,如果資料集名稱為 NorthwindDataSet,則在 NorthwindDataSet 中,與 DataTable 關聯的 TableAdapter 會位於 NorthwindDataSetTableAdapters 命名空間中。 若要以程式方式存取特定 TableAdapter,就必須宣告 TableAdapter 的新執行個體。 例如:

            NorthwindDataSet northwindDataSet = new NorthwindDataSet();

            NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
                new NorthwindDataSetTableAdapters.CustomersTableAdapter();

            customersTableAdapter.Fill(northwindDataSet.Customers);
        Dim northwindDataSet As New NorthwindDataSet()
        Dim customersTableAdapter As New NorthwindDataSetTableAdapters.CustomersTableAdapter()

        customersTableAdapter.Fill(northwindDataSet.Customers)

關聯 DataTable 的結構描述

建立 TableAdapter 時,會使用初始查詢或預存程序,定義 TableAdapter 關聯 DataTable 的結構描述。 您可以呼叫 TableAdapter 的主要 Fill 方法 (這個方法會填入 TableAdapter 的關聯 DataTable),以執行這個初始查詢或預存程序。 任何 TableAdapter 的主查詢變更,都會反映在關聯資料表的結構描述中。 例如,從主查詢移除資料行時,就會從關聯資料表移除此資料行。 如果 TableAdapter 上的任何其他查詢使用 SQL 陳述式,傳回不在主查詢中的資料行,設計工具就會嘗試同步處理主查詢和任何其他查詢之間的資料行變更。 如需詳細資訊,請參閱如何:編輯 TableAdapter

TableAdapter 的更新命令

TableAdapter 的更新功能,取決於 [TableAdapter 精靈] 中主查詢所提供的資訊。 例如,設定為擷取多個資料表的值 (聯結)、純量值、檢視或彙總函式結果的 TableAdapter,在最初建立時,並沒有將更新傳回基礎資料庫的能力。 不過,您可以在 [屬性] 視窗中手動設定 INSERT、UPDATE 和 DELETE 命令。

TableAdapter 查詢

具有多個查詢的 TableAdapter

TableAdapter 與標準資料配接器不同,它可以包含多個查詢,填入關聯的資料表。 只要查詢傳回的資料符合與 TableAdapter 關聯資料表的相同結構描述,您就可以根據應用程式需求,定義多個查詢。 這項功能可讓您載入滿足不同準則的資料。 例如,如果應用程式包含客戶資料表,您就可以建立查詢,將名字為特定字母開頭的每一位客戶填入資料表,並建立另一個查詢,將來自同一州的所有客戶填入資料表。 您可以建立一個 FillByState 查詢,並使用州值做為參數 (SELECT * FROM Customers WHERE State = @State),即可將特定州的客戶填入 Customers 資料表。 呼叫 FillByState 方法,並傳入如下的參數值:CustomerTableAdapter.FillByState("WA"),即可執行此查詢。 如需詳細資訊,請參閱如何:建立 TableAdapter 查詢

除了傳回與 TableAdapter 資料表的相同結構描述資料的查詢,您還可以加入傳回純量值 (單一值) 的查詢。 例如,建立可傳回客戶數的查詢 (SELECT Count(*) From Customers) 就是 CustomersTableAdapter 的有效查詢,即使傳回的資料不符合資料表的結構描述亦然。

ClearBeforeFill 屬性

TableAdapter 增加了一個基底類別 DataAdapter 所沒有的額外屬性。 每次您執行查詢以填入 TableAdapter 的資料表時,預設會清除資料,只將查詢結果載入資料表。 如果您要將查詢傳回的資料加入或合併至資料表的現有資料,請將 TableAdapter 的 ClearBeforeFill 屬性設為 false。 不論是否要清除資料,必要時,最好明確地將更新傳回資料庫。 所以,請記得,再次執行填入資料表的查詢之前,先儲存資料表的資料變更。 如需詳細資訊,請參閱如何:使用 TableAdapter 更新資料

TableAdapter 繼承

TableAdapter 會封裝已設定的 DataAdapter,藉以擴充標準資料配接器的功能。 根據預設,TableAdapter 繼承自 Component,並且無法轉型成 DataAdapter 類別。 將 TableAdapter 轉型成 DataAdapter,會造成 InvalidCastException。 若要變更一個 TableAdapter 的基底類別,您可以在 [DataSet 設計工具] 的 TableAdapter [基底類別] 屬性中,輸入衍生自 Component 的類別。

TableAdapter 的方法和屬性

TableAdapter 類別不是 .NET Framework 的一部分,因此無法在文件或 [物件瀏覽器] 中加以查詢。 在設計階段時,您可以使用上述其中一個精靈建立它。 建立 TableAdapter 時,會根據使用的資料表名稱,指定 TableAdapter 的名稱。 例如,根據資料庫中名為 Orders 的資料表,建立 TableAdapter 時,TableAdapter 便命名為 OrdersTableAdapter。 您可以使用 [DataSet 設計工具] 的 [名稱] 屬性,變更 TableAdapter 的類別名稱。

下面是 TableAdapter 的常用方法和屬性:

成員 描述
TableAdapter.Fill 將 TableAdapter 的 SELECT 命令結果,填入 TableAdapter 的關聯資料表。 如需詳細資訊,請參閱如何:以資料填入資料集
TableAdapter.Update 將變更傳送回資料庫,並傳回代表受到更新影響之資料列數的整數。 如需詳細資訊,請參閱如何:使用 TableAdapter 更新資料
TableAdapter.GetData 傳回已填入資料的新 DataTable
TableAdapter.Insert 在資料表中建立新的資料列。 如需詳細資訊,請參閱如何:將資料列加入至 DataTable
TableAdapter.ClearBeforeFill 在您呼叫其中一個 Fill 方法之前,判斷資料表是否已清空。

TableAdapter 的更新方法

TableAdapter 會使用資料命令,對資料庫進行讀寫動作。 TableAdapter 的初始 Fill (主) 查詢是建立關聯資料表的結構描述 (以及與 TableAdapter.Update 方法關聯的 InsertCommandUpdateCommandDeleteCommand 命令) 的基礎。 這表示,呼叫 TableAdapter 的 Update 方法,會執行原先設定 TableAdapter 時所建立的陳述式,而不是以 [TableAdapter 查詢組態精靈] 所加入的其他查詢。

在使用 TableAdapter 時,它能有效地執行與您使用一般命令所執行之相同的作業。 例如,當您呼叫配接器的 Fill 方法時,配接器會執行在其 SelectCommand 屬性中的資料命令,並使用資料讀取器 (例如,SqlDataReader) 將結果集載入資料表。 同樣地,在呼叫配接器的 Update 方法時,它會針對資料表中每一筆變更過的資料錄,執行適當命令 (在 UpdateCommandInsertCommandDeleteCommand 屬性中)。

注意

如果主查詢的資訊充足,在產生 TableAdapter 時,預設會建立 InsertCommandUpdateCommandDeleteCommand 命令。 如果 TableAdapter 的主查詢超過單一資料表 SELECT 陳述式,則設計工具可能無法產生 InsertCommandUpdateCommandDeleteCommand。 如果沒有產生這些命令,執行 TableAdapter.Update 方法時,可能會發生錯誤。

TableAdapter GenerateDbDirectMethods

除了 InsertCommandUpdateCommandDeleteCommand 之外,還可以使用直接執行於資料庫的方法,建立 TableAdapter。 您可以直接呼叫這些方法 (TableAdapter.InsertTableAdapter.UpdateTableAdapter.Delete),管理資料庫中的資料。 這表示您可以從程式碼呼叫這些個別方法,而不需要呼叫 TableAdapter.Update 即可處理針對關聯資料表所暫止的插入、更新和刪除作業。

如果您不要建立這些直接方法,請將 TableAdapter 的 GenerateDbDirectMethods 屬性設為 false (在 [屬性] 視窗中)。 加入至 TableAdapter 的其他查詢是獨立查詢,它們不會產生這些方法。

TableAdapter 支援可為 Null 的型別

TableAdapter 支援可為 Null 的型別 Nullable(Of T)T?。 如需 Visual Basic 中可為 Null 的型別之詳細資訊,請參閱Nullable Value Types。 如需 C# 中可為 Null 的型別之詳細資訊,請參閱用可為 Null 的類型

請參閱

資料逐步解說
如何:連接至資料庫中的資料
逐步解說:連接至資料庫中的資料 (Windows Form)
準備您的應用程式以接收資料
將資料擷取至您的應用程式中
將控制項繫結至 Visual Studio 中的資料
在您的應用程式中編輯資料
驗證資料
儲存資料