共用方式為


在 .NET Framework 應用程式中使用 TableAdapters 填滿數據集

注意

數據集和相關類別是 2000 年代初的舊版 .NET Framework 技術,可讓應用程式在應用程式與資料庫中斷連線時使用記憶體中的數據。 這些技術特別適用於可讓使用者修改數據並將變更保存回資料庫的應用程式。 雖然數據集已證明是非常成功的技術,但建議新的 .NET 應用程式使用 Entity Framework Core。 Entity Framework 提供更自然的方式,以表格式數據作為物件模型使用,而且具有更簡單的程序設計介面。

TableAdapter 元件會根據您指定的一或多個查詢或預存程式,以資料庫中的數據填滿數據集。 TableAdapters 也可以對資料庫執行新增、更新和刪除,以保存您對數據集所做的變更。 此外,您可以發出與任何特定數據表無關的全域命令。

注意

Visual Studio 設計工具會產生 TableAdapters。 如果您要以程式設計方式建立數據集,請使用 DataAdapter .NET 類別。

如需 TableAdapter 作業的詳細資訊,您可以直接跳至下列其中一篇文章:

文章 描述
建立及設定 TableAdapters 瞭解如何使用設計器來建立及設定 TableAdapters。
建立具參數化的 TableAdapter 查詢 瞭解如何讓使用者將自變數提供給 TableAdapter 程式或查詢。
使用 TableAdapter 直接存取資料庫 瞭解如何使用 TableAdapters DbDirect 方法。
填入數據集時關閉條件約束 瞭解如何在更新數據時使用外鍵條件約束。
擴充 TableAdapter 的功能 瞭解如何將自定義程式代碼新增至 TableAdapters。
將 XML 資料讀取至數據集 瞭解如何在數據集中使用 XML 數據。

TableAdapter 概觀

TableAdapters 是設計工具產生的元件,可連線到資料庫、執行查詢或預存程式,並以傳回的數據填滿其 DataTable。 TableAdapters 也會將更新的數據從您的應用程式傳送回資料庫。 只要其傳回符合其相關聯數據表架構的數據,就可以在 TableAdapter 上執行所需的查詢數目。 下圖顯示 TableAdapters 如何與記憶體中的資料庫和其他物件互動:

顯示用戶端應用程式中 TableAdapter 資料流的圖表。

雖然 TableAdapters 是使用資料集設計工具所設計,但 TableAdapter 類別不會產生為 DataSet的巢狀類別。 相反地,它們位於每個數據集專屬的個別命名空間中。 例如,如果您有名為 NorthwindDataSet的數據集,則與 NorthwindDataSetDataTable 對象相關聯的 TableAdapters 位於 NorthwindDataSetTableAdapters 命名空間中。 若要以程式設計方式存取特定的 TableAdapter,請宣告 TableAdapter 類別的新實例。 例如:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

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

customersTableAdapter.Fill(northwindDataSet.Customers);

相關聯的 DataTable 架構

當您建立 TableAdapter 時,您可以使用初始查詢或預存程式來定義 TableAdapter 相關聯 DataTable的架構。 您可以呼叫 TableAdapter 的 Fill 方法來執行這個初始查詢或預存程式,此方法會填入 TableAdapter 的相關 DataTable。 您對 TableAdapter 主要查詢所做的任何變更,都反映在相關聯數據表的架構中。 例如,如果您從主要查詢中移除數據行,數據集設計工具也會從相關聯的數據表中移除數據行。 如果 TableAdapter 上的任何其他查詢使用傳回不在主要查詢中的數據行的 SQL 語句,數據集設計工具會嘗試同步處理主要查詢與其他查詢之間的數據行變更。

TableAdapter 更新命令

TableAdapter 的更新功能取決於 TableAdapter 精靈中主要查詢中可用的資訊量。 例如,TableAdapters 被設定為從多個數據表(使用 JOIN)、純量值、檢視或匯總函數的結果中擷取值時,起初不具備傳回更新到基礎資料庫的能力。 不過,您可以在 [屬性] 視窗中手動設定 InsertCommandUpdateCommandDeleteCommand 属性。

TableAdapter 查詢

TableAdapters 可以包含多個查詢,以填滿其相關聯的數據表。 您可以根據應用程式的需求定義多個 TableAdapter 查詢,只要每個查詢傳回的數據符合其所關聯的數據表的架構即可。 這項功能可讓 TableAdapter 根據不同的準則載入不同的結果。

顯示具有多個查詢的 TableAdapter 圖表。

例如,如果您的應用程式包含具有客戶名稱的數據表,您可以建立查詢,以以特定字母開頭的每個客戶名稱填滿數據表。 您可以建立另一個查詢,以所有位於相同州的客戶填滿資料表。 若要將 Customers 資料表填入屬於指定州的客戶,請建立一個 FillByState 查詢,以接受州值作為參數,如下所示:SELECT * FROM Customers WHERE State = @State。 呼叫 FillByState 方法來執行查詢,並傳入參數值,例如:CustomerTableAdapter.FillByState("WA")

除了新增傳回與 TableAdapter 數據表相同架構數據的查詢之外,您還可以新增傳回純量(單一) 值的查詢。 例如,傳回客戶計數的查詢(SELECT Count(*) From Customers)對 CustomersTableAdapter有效,即使傳回的數據不符合數據表的架構也一樣。

ClearBeforeFill 屬性

根據預設,每次執行查詢以填滿 TableAdapter 的數據表時,會清除現有的數據,而且只會將查詢的結果載入數據表中。 如果您要加入或合併查詢傳回至資料表中現有資料的數據,請將 TableAdapter 的 ClearBeforeFill 屬性設定為 false。 無論您是否清除數據,如果您想要保存更新,都必須明確地將更新傳回資料庫。 因此,在執行另一個填滿數據表的查詢之前,請務必先儲存數據表中數據的任何變更。 如需詳細資訊,請參閱 使用 TableAdapter更新數據。

TableAdapter 繼承

TableAdapters 藉由封裝已設定的 DataAdapter 類別,來擴充標準數據配接器的功能。 根據預設,TableAdapter 繼承自 Component 類別,而且無法轉換成 DataAdapter 類別。 將 TableAdapter 轉換成 DataAdapter 類別會導致 InvalidCastException 錯誤。 若要變更 TableAdapter 的基類,請指定衍生自數據集設計工具中 TableAdapter 基類 屬性中 Component 類別的類別。

TableAdapter 方法和屬性

TableAdapter 類別不是 .NET 類型,這表示您無法在物件瀏覽器或參考檔中查閱。 當您使用先前所述的其中一個工具時,Visual Studio 會在設計階段建立它。 Visual Studio 指派給您所建立之 TableAdapter 的名稱是以您正在使用的數據表名稱為基礎。 例如,當您根據名為 Orders之資料庫中的數據表建立 TableAdapter 時,TableAdapter 會命名為 OrdersTableAdapter。 若要變更 TableAdapter 的類別名稱,請使用數據集設計工具的 [屬性] 視窗中的 [名稱] 屬性。

TableAdapter 的常用方法和屬性如下所示:

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

TableAdapter 更新方法

TableAdapters 會使用數據命令從資料庫讀取和寫入。 使用 TableAdapter 的初始 Fill (main) 查詢作為建立相關聯數據表架構的基礎,以及與 TableAdapter.Update 方法相關聯的 InsertCommandUpdateCommandDeleteCommand 命令。 當您呼叫 TableAdapter 的 Update 方法時,它會執行原本設定 TableAdapter 時所建立的語句,而不是您使用 tableAdapter 查詢設定精靈 新增的額外查詢之一。

當您使用 TableAdapter 時,它會使用您通常執行的命令,有效地執行相同的作業。 例如,當您呼叫配接器的 Fill 方法時,配接器會在其 SelectCommand 屬性中執行數據命令,並使用數據讀取器(例如,SqlDataReader)將結果集載入數據表中。 同樣地,當您呼叫配接器的 Update 方法時,它會針對數據表中每個變更的記錄執行適當的命令(在 UpdateCommandInsertCommandDeleteCommand 屬性中)。

注意

如果主要查詢包含足夠的資訊,設計工具會在設計工具產生 TableAdapter 時,預設建立 InsertCommandUpdateCommandDeleteCommand 命令。 不過,如果 TableAdapter 的主要查詢超過單一數據表 SELECT 語句,設計工具可能無法產生這些命令。 在這種情況下,當您執行 TableAdapter.Update 方法時,可能會收到錯誤。

TableAdapter 生成資料庫直接方法

除了 InsertCommandUpdateCommandDeleteCommand之外,TableAdapters 還使用下列方法建立,您可以直接對資料庫執行:TableAdapter.InsertTableAdapter.UpdateTableAdapter.Delete。 您可以直接呼叫這些方法來操作資料庫中的資料。 這樣做表示您可以從程式代碼呼叫這些個別方法,而不是呼叫 TableAdapter.Update 來處理相關聯數據表擱置的插入、更新和刪除。

如果您不想建立這些直接方法,請在 [屬性] 視窗中,將 TableAdapter 的 GenerateDbDirectMethods 屬性設定為 False。 新增至 TableAdapter 的額外查詢是獨立查詢,不會產生這些方法。

TableAdapter 支援可為 Null 的類型

TableAdapters 支援可為 Null 的類型 Nullable<T>T?。 如需有關 Visual Basic 中可以為 Null 的型別的更多資訊,請參閱 可以為 Null 的數值型別(Visual Basic)。 如需有關 C# 中可為 Null 的類型的詳細資訊,請參閱 可為 Null 的值類型(C#)

TableAdapterManager 參考

根據預設,當您建立包含相關數據表的數據集時,Visual Studio 會產生 TableAdapterManager 類別。 若要防止產生 類別,請將資料集的 Hierarchical Update 屬性值變更為 false。 當您將具有關聯的數據表拖曳到 Windows Form 或 WPF 頁面的設計介面時,Visual Studio 會宣告 類別的成員變數。 如果您沒有使用數據系結,則必須手動宣告變數。

因為 TableAdapterManager 類別不是 .NET 類型,所以不會出現在參考檔中。 Visual Studio 會在設計階段建立它,作為資料集建立過程的一部分。

下表列出 TableAdapterManager 類別的常用方法和屬性:

成員 描述
UpdateAll 方法 儲存所有數據表中的所有數據。
BackUpDataSetBeforeUpdate 屬性 判斷在執行 TableAdapterManager.UpdateAllmethod.Boolean之前,是否要建立數據集的備份複本。
tableNameTableAdapter 屬性 表示 TableAdapter。 產生的 TableAdapterManager 包含它所管理之每個 TableAdapter 的屬性。 例如,具有 Customers 和 Orders 數據表的數據集會產生包含 CustomersTableAdapterOrdersTableAdapter 屬性的 TableAdapterManager。
UpdateOrder 屬性 控制個別插入、更新和刪除命令的順序。 將此屬性設定為 TableAdapterManager.UpdateOrderOption 列舉中的其中一個值。

根據預設,UpdateOrder 會設定為 InsertUpdateDelete,這表示會針對數據集中的所有數據表執行插入、更新和刪除。

安全

當您使用數據命令搭配設定為 TextCommandType 屬性時,請先仔細檢查從用戶端傳送的資訊,再將它傳遞至資料庫。 惡意使用者可能會嘗試傳送已修改或額外的 SQL 語句,以取得未經授權的數據庫存取權。 將使用者輸入傳送至資料庫之前,請一律確認資訊是否有效。 最佳做法是盡可能使用參數化查詢或預存程式。