使用 Tableadapter 填充數據集

使用 Tableadapter 填充數據集

TableAdapter 組件根據指定的一個或多個查詢或存儲過程,使用數據庫中的數據填充數據集。 Tableadapter 還可以對數據庫執行添加、更新和刪除操作,以便保存對數據集所做的更改。 還可以發出與任何特定表無關的全局命令。

 備註

Tableadapter 由 Visual Studio 設計器生成。 如果要以編程方式創建數據集,請使用 DataAdapter,這是一個 .NET 類。

有關 TableAdapter 操作的詳細信息,可以直接跳到以下主題之一:

表 1
主題說明
創建和配置 TableAdapter 如何使用設計器創建和配置 Tableadapter
創建參數化 TableAdapter 查詢 如何使用戶能夠爲 TableAdapter 過程或查詢提供參數
使用 TableAdapter 直接訪問數據庫 如何使用 Tableadapter 的 Dbdirect 方法
在填充數據集時關閉約束 如何在更新數據時使用 foreign key 約束
如何:擴展 TableAdapter 的功能 如何將自定義代碼添加到 Tableadapter
將 XML 數據讀入數據集 如何使用 XML

TableAdapter 概述

Tableadapter 是由設計器生成的組件,用於連接到數據庫、運行查詢或存儲過程,並使用返回的數據填充其 DataTable。 Tableadapter 還會將更新的數據從應用程序發送回數據庫。 可以在 TableAdapter 上運行任意多個查詢,前提是這些查詢返回的數據符合與 TableAdapter 關聯的表的架構。 下圖顯示了 Tableadapter 如何與數據庫和內存中的其他對象進行交互:

客戶端應用程序中的數據流

儘管 Tableadapter 是用數據集設計器設計的,但 TableAdapter 類不會生成爲的嵌套類 DataSet 。 它們位於特定於每個數據集的不同命名空間中。 例如,如果你有一個名爲的數據集 NorthwindDataSet ,則與中的關聯的 tableadapter 將 DataTable NorthwindDataSet 在 NorthwindDataSetTableAdapters 命名空間中。 若要以編程方式訪問特定 TableAdapter,必須聲明 TableAdapter 的新實例。 例如:

C#
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 嚮導的主查詢中提供了多少信息。 例如,配置爲從多個表中提取值的 Tableadapter (使用 JOIN )、標量值、視圖或聚合函數的結果,最初不能將更新發送回底層數據庫。 但是,你可以 INSERT UPDATE DELETE 在 "屬性" 窗口中手動配置、和命令。

TableAdapter 查詢

帶有多個查詢的 TableAdapter

Tableadapter 可包含多個查詢來填充關聯的數據表。 您可以根據應用程序的需要爲 TableAdapter 定義任意多個查詢,前提是每個查詢都返回與其關聯數據表具有相同架構的數據。 此功能使 TableAdapter 能夠根據不同的條件加載不同的結果。

例如,如果您的應用程序包含包含客戶名稱的表,則您可以創建一個查詢,該查詢使用以特定字母開頭的每個客戶名稱來填充表,而另一個則使用處於相同狀態的所有客戶填充該表。 若要 Customers 使用處於給定狀態的客戶填充表,可以創建一個 FillByState 查詢,該查詢採用狀態值的參數,如下所示: SELECT * FROM Customers WHERE State = @State 。 可以通過調用 FillByState 方法並傳入參數值來運行查詢,如下所示: CustomerTableAdapter.FillByState("WA") 。

除了添加返回與 TableAdapter 的數據表相同的架構數據的查詢之外,還可以添加返回標量(單)值的查詢。 例如,如果 SELECT Count(*) From Customers CustomersTableAdapter, 返回的數據不符合表的架構,則返回客戶計數()的查詢對於有效。

ClearBeforeFill 屬性

默認情況下,每次運行查詢以填充 TableAdapter 的數據表時,現有數據會被清除,並且僅將查詢的結果加載到表中。 ClearBeforeFill false 如果要將從查詢返回的數據添加或合併到數據表中的現有數據,請將 TableAdapter 的屬性設置爲。 不管是否清除數據,都需要將更新顯式發送回數據庫(如果要保存這些更新)。 因此,請記住在運行填充表的另一個查詢之前保存對錶中數據所做的任何更改。 有關詳細信息,請參閱使用 TableAdapter 更新數據

TableAdapter 繼承

Tableadapter 通過封裝配置的類來擴展標準數據適配器的功能 DataAdapter 。 默認情況下,TableAdapter 從類繼承 Component ,不能轉換爲 DataAdapter 類。 將 TableAdapter 轉換爲 DataAdapter 類會導致 InvalidCastException 錯誤。 若要更改 TableAdapter 的基類,可以指定從 Component 數據集設計器中的 Tableadapter 的 "基類" 屬性派生的類。

TableAdapter 方法和屬性

TableAdapter 類不是 .NET 類型。 這意味着不能在文檔或對象瀏覽器中查找。 它在設計時使用前面提到的嚮導之一創建。 根據所使用的表的名稱,在創建時分配給 TableAdapter 的名稱。 例如,基於名爲的數據庫中的表創建 TableAdapter 時 Orders ,tableadapter 的名稱爲 OrdersTableAdapter 。 可以使用數據集設計器中的 "名稱" 屬性更改 TableAdapter 的類名。

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

TABLEADAPTER 方法和屬性
成員描述
TableAdapter.Fill 用 TableAdapter 的命令的結果填充 TableAdapter 的關聯數據表 SELECT 。
TableAdapter.Update 將更改發送回數據庫,並返回一個整數,該整數表示受更新影響的行數。 有關詳細信息,請參閱使用 TableAdapter 更新數據
TableAdapter.GetData 返回填充了 DataTable 數據的新。
TableAdapter.Insert 在數據表中創建新行。 有關詳細信息,請參閱在數據庫中插入新記錄
TableAdapter.ClearBeforeFill 確定在調用方法之一之前是否清空數據表 Fill 。

TableAdapter 更新方法

Tableadapter 使用數據命令從數據庫中讀取和寫入數據。 使用 TableAdapter 的初始 Fill (main)查詢作爲創建關聯數據表的架構的基礎,以及 InsertCommand UpdateCommand DeleteCommand 與方法相關聯的、、和命令 TableAdapter.Update 。 調用 TableAdapter 的 Update 方法會運行最初配置 TableAdapter 時創建的語句,而不是使用TableAdapter 查詢配置嚮導添加的其他查詢之一。

使用 TableAdapter 時,它會有效地執行與通常會執行的命令相同的操作。 例如,當您調用適配器的方法時 Fill ,適配器會在其屬性中運行數據命令 SelectCommand ,並使用數據讀取器(例如 SqlDataReader )將結果集加載到數據表中。 同樣,在調用適配器的方法時 Update ,它會 UpdateCommand InsertCommand DeleteCommand 爲數據表中的每個已更改的記錄運行相應的命令(在、和屬性中)。

 備註

如果主查詢中有足夠的信息,則 InsertCommand 默認情況下,在 UpdateCommand DeleteCommand 生成 TableAdapter 時,會創建、和命令。 如果 TableAdapter 的主查詢多於單個表 SELECT 語句,設計器可能無法生成 InsertCommand 、 UpdateCommand 和 DeleteCommand 。 如果未生成這些命令,則在運行該方法時可能會收到錯誤 TableAdapter.Update 。

TableAdapter GenerateDbDirectMethods

除了 InsertCommand 、和以外 UpdateCommand ,還 DeleteCommand 可以通過對數據庫直接運行的方法創建 tableadapter。 您可以直接調用這些方法( TableAdapter.Insert 、 TableAdapter.Update 和 TableAdapter.Delete )來操作數據庫中的數據。 這意味着你可以從代碼中調用這些單獨的方法,而不是調用 TableAdapter.Update 來處理爲關聯數據表掛起的插入、更新和刪除操作。

如果不想創建這些直接方法,請將 TableAdapter 的GenerateDbDirectMethods屬性設置爲 false (在 "屬性" 窗口中)。 添加到 TableAdapter 的其他查詢是獨立查詢,它們不會生成這些方法。

TableAdapter 支持可以爲 null 的類型

Tableadapter 支持可以爲 null Nullable(Of T) 的類型和 T? 。 若要深入瞭解 Visual Basic 中可以爲 null 的類型,請參閱可以爲 null 的值類型。 有關 c # 中可以爲 null 的類型的詳細信息,請參閱使用可以爲 null 的類型

TableAdapterManager 引用

默認情況下,當您創建包含相關表的數據集時,TableAdapterManager 類將生成。 若要防止生成類,請將 Hierarchical Update 數據集的屬性值更改爲 false。 將具有關係的表拖到 Windows 窗體或 WPF 頁的設計圖面上時,Visual Studio 將聲明類的成員變量。 如果不使用數據綁定,則必須手動聲明該變量。

TableAdapterManager 類不是 .NET 類型。 因此,您不能在文檔中查找它。 它在設計時創建,作爲數據集創建過程的一部分。

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

TABLEADAPTERMANAGER 引用
成員描述
UpdateAll 方法 保存所有數據表中的所有數據。
BackUpDataSetBeforeUpdate 屬性 確定在執行方法之前是否創建數據集的備份副本 TableAdapterManager.UpdateAll 。變量.
tableName TableAdapter知識產權 表示 TableAdapter。 生成的 TableAdapterManager 包含其管理的每個屬性的屬性 TableAdapter 。 例如,具有 Customers 和 Orders 表的數據集將生成包含和屬性的 TableAdapterManager CustomersTableAdapter OrdersTableAdapter 。
UpdateOrder 屬性 控制單個 insert、update 和 delete 命令的順序。 將此項設置爲枚舉中的值之一 TableAdapterManager.UpdateOrderOption 。

默認情況下, UpdateOrder 設置爲InsertUpdateDelete。 這意味着對數據集中的所有表執行 insert、update 和 delete 操作。

安全性

如果使用的數據命令的 CommandType 屬性設置爲 Text ,請在將客戶端傳遞到數據庫之前,仔細檢查從該客戶端發送的信息。 惡意用戶會設法發送(注入)經過修改或附加的 SQL 語句,企圖對數據庫進行未經授權的訪問或破壞數據庫。 將用戶輸入傳輸到數據庫之前,請始終驗證信息是否有效。 最佳做法是儘可能使用參數化查詢或存儲過程。


 

N 層數據應用程序概述

N 層數據應用程序是分爲多個的數據應用程序。 也稱爲 "分佈式應用程序" 和 "多層應用程序",n 層應用程序將處理單獨處理到在客戶端和服務器之間分佈的離散層。 開發訪問數據的應用程序時,應在構成應用程序的各個層之間明確分隔。

典型的 n 層應用程序包括一個表示層、一箇中間層和一個數據層。 分隔 n 層應用程序中各個層的最簡單方法是爲每個要包括在應用程序中的層創建不同的項目。 例如,表示層可能是 Windows 窗體應用程序,而數據訪問邏輯可能是位於中間層的類庫。 此外,表示層可以通過服務(如 web 服務)與中間層中的數據訪問邏輯通信。 將應用程序組件分離到不同的層可提高應用程序的可維護性和可伸縮性。 爲實現此功能,可更輕鬆地採用可應用於單個層的新技術,而無需重新設計整個解決方案。 此外,n 層應用程序通常將敏感信息存儲在中間層中,這會保持與表示層的隔離。

Visual Studio 包含多項功能,可幫助開發人員創建 n 層應用程序:

  • 數據集提供了一個數據集項目屬性,使你能夠將數據集(數據實體層)和 tableadapter (數據訪問層)分成不同的項目。

  • Visual Studio 中的 LINQ to SQL 工具提供了用於將 DataContext 和數據類生成到單獨命名空間中的設置。 這可以實現數據訪問層和數據實體層的邏輯分離。

  • LINQ to SQL提供了一 Attach 種方法,使你可以將應用程序中不同層的 DataContext 組合在一起。 有關詳細信息,請參閱具有 LINQ to SQL 的 N 層和遠程應用程序

表示層

呈現層是用戶與應用程序進行交互的層。 它通常還包含其他應用程序邏輯。 典型的表示層組件包括:

呈現層通常使用服務引用訪問中間層(例如,在 Visual Studio 應用程序中 Windows Communication Foundation 服務和 WCF 數據服務)。 呈現層不直接訪問數據層。 呈現層通過中間層中數據訪問組件的方式與數據層通信。

中間層

中間層是表示層和數據層用來相互通信的層。 典型的中間層組件包括:

  • 業務邏輯,如業務規則和數據驗證。

  • 數據訪問組件和邏輯,如下所示:

下圖顯示了 Visual Studio 中可用的功能和技術,以及它們可能適合於 n 層應用程序的中間層的位置。

中間層組件  中間層

中間層通常使用數據連接連接到數據層。 此數據連接通常存儲在數據訪問組件中。

數據層

數據層基本上是存儲應用程序數據的服務器(例如運行 SQL Server 的服務器)。

下圖顯示了 Visual Studio 中可用的功能和技術,以及它們可能適合 n 層應用程序的數據層的位置。

數據層組件  數據層

數據層無法直接從表示層中的客戶端訪問。 中間層中的數據訪問組件用於表示層和數據層之間的通信。

N 層開發幫助

以下主題提供有關使用 n 層應用程序的信息:

將數據集和 Tableadapter 分隔到不同的項目中

演練:創建 n 層數據應用程序

N 層和遠程應用程序與 LINQ to SQL

請參閱


 

將數據集和 TableAdapter 分離到不同的項目中

已對類型化的數據集進行了增強,以便可以將tableadapter和 dataset 類生成到單獨的項目中。 這使你能夠快速分離應用程序層並生成 n 層數據應用程序。

下面的過程介紹使用數據集設計器將數據集代碼生成到與包含生成的 TableAdapter 代碼的項目不同的項目中的過程。

單獨的數據集和 Tableadapter

將數據集代碼與 TableAdapter 代碼分離時,包含數據集代碼的項目必須位於當前解決方案中。 如果此項目不在當前解決方案中,則它將不會出現在 "屬性" 窗口的 "數據集項目" 列表中。

 備註

本文中的某些 Visual Studio 用戶界面元素在計算機上出現的名稱或位置可能會不同。 你可能正在使用其他版本的 Visual Studio 或其他環境設置。 有關詳細信息,請參閱個性化設置 IDE

將數據集分隔到不同的項目中

  1. 打開包含數據集的解決方案(.xsd文件)。

     備註

    如果解決方案不包含要將數據集代碼分離到其中的項目,請創建項目,或者將現有項目添加到解決方案中。

  2. 雙擊解決方案資源管理器中的類型化數據集文件( .xsd文件)以打開數據集設計器中的數據集。

  3. 選擇數據集設計器的空白區域。

  4. 在 "屬性" 窗口中,找到 "數據集項目" 節點。

  5. 在 "數據集項目" 列表中,選擇要在其中生成數據集代碼的項目的名稱。

    選擇要在其中生成數據集代碼的項目後,將使用默認文件名填充 "數據集文件" 屬性。 如果需要,可以更改此名稱。 此外,如果想要將數據集代碼生成到特定目錄中,則可以將 "項目文件夾" 屬性設置爲文件夾的名稱。

     備註

    分離數據集和 Tableadapter (通過設置 "數據集項目" 屬性)時,不會自動移動項目中的現有部分數據集類。 必須將現有部分數據集類手動移動到數據集項目。

  6. 保存數據集。

    數據集代碼生成到數據集項目屬性中的選定項目,並且TableAdapter代碼生成到當前項目中。

默認情況下,在分離數據集和 TableAdapter 代碼後,結果是每個項目中的離散類文件。 原始項目包含一個名爲DatasetName (或DatasetName.Designer.cs)的文件,該文件包含 TableAdapter 代碼。 數據集項目屬性中指定的項目包含一個名爲DatasetName (或DatasetName.DataSet.Designer.cs)的文件,該文件包含數據集代碼。

 備註

若要查看生成的類文件,請選擇數據集或 TableAdapter 項目。 然後,在解決方案資源管理器中,選擇 "顯示所有文件"。

另請參閱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章