共用方式為


逐步解說:使用 ADO.NET 和 .NET Framework 建立多層式數據應用程式

備註

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

N 層 數據應用程式是那些存取數據並分成多個邏輯層或 階層的應用程式。 將應用程式元件分成離散層會增加應用程式的可維護性和延展性。 其方式是讓您更輕鬆地採用可套用至單一層的新技術,而不需要重新設計整個解決方案。 多層式架構包含表示層、仲介層和數據層。 仲介層通常包含數據存取層、業務邏輯層,以及驗證和認證等共用元件。 數據層包含關係資料庫。 多層式應用程式通常會將敏感性資訊儲存在中間層的資料存取層,以維持與存取呈現層的使用者隔離。 如需詳細資訊,請參閱 多層式數據應用程式概觀

在多層式應用程式中分隔各種階層的其中一種方式,就是針對您想要包含在應用程式中的每個層級建立離散專案。 具型別數據集包含 DataSet Project 屬性,可決定產生的數據集和 TableAdapter 程式代碼應該進入哪些專案。

本逐步解說示範如何使用TableAdapter工具,將數據集和程序代碼分成離散類別庫專案。 在分隔數據集和 TableAdapter 程式代碼之後,您會 在 Visual Studio 服務中建立 Windows Communication Foundation Services 和 WCF Data Services ,以呼叫數據存取層。 最後,您會建立 Windows Forms 應用程式做為表示層。 此層會從數據服務存取數據。

在此逐步解說期間,您會執行下列步驟:

  • 建立包含多個專案的新多層式解決方案。

  • 將兩個類別庫專案新增至多層式解決方案。

  • 使用 [數據源組態精靈] 建立具類型的數據集。

  • 將產生的 TableAdapters 和數據集程式代碼分成離散專案。

  • 建立 Windows Communication Foundation (WCF) 服務,以呼叫數據存取層。

  • 在服務中建立函式,以從數據存取層擷取數據。

  • 建立 Windows Forms 應用程式做為表示層。

  • 建立系結至數據源的 Windows Forms 控件。

  • 撰寫程式代碼以填入數據表。

先決條件

若要完成本教學課程,您需要在 Visual Studio 中安裝的 .NET 桌面開發和資料儲存及處理工作負載。 若要安裝它們,請開啟 Visual Studio Installer,然後選擇您想要修改的 Visual Studio 版本旁的 [修改] (或 [更多>修改])。 請參閱 修改 Visual Studio

本逐步解說使用 SQL Server Express LocalDB 和 Northwind 範例資料庫。

  1. 如果您沒有 SQL Server Express LocalDB,請從 SQL Server Express 下載頁面或透過 Visual Studio 安裝程式進行安裝。 在 Visual Studio 安裝程式中,您可以將 SQL Server Express LocalDB 安裝為 .NET 桌面開發 工作負載的一部分,或安裝為個別元件。

  2. 依照下列步驟安裝 Northwind 範例資料庫:

    1. 在 Visual Studio 中,開啟 [SQL Server 物件總管] 視窗。 (SQL Server 物件總管 安裝為 Visual Studio 安裝程式中 資料儲存和處理 工作負載的一部分。)展開 SQL Server 節點。 以滑鼠右鍵點擊您的 LocalDB 實例,然後選取 新增查詢

      如果您沒有看到 LocalDB 實例,請使用工具列按鈕 [新增 SQL Server]。 對話框隨即出現。 在對話框中,展開 本機,然後選擇 MSSQLLocalDB。 輸入適當的認證。 您可以保留資料庫的預設選擇。

      [連接到 SQL Database] 對話框的螢幕快照

    2. 選擇 連線。 在 SQL Server 對象瀏覽器中新增了 LocalDB 節點。

    3. 以滑鼠右鍵點擊您的 LocalDB 實例,然後選取 新增查詢

      查詢編輯器視窗隨即開啟。

    4. Northwind Transact-SQL 腳本 複製到剪貼簿。 此 T-SQL 腳本會從頭開始建立 Northwind 資料庫,並填入數據。

    5. 將 T-SQL 文稿貼到查詢編輯器中,然後選擇 [執行] 按鈕。

      在短時間內,查詢會完成執行,並建立 Northwind 資料庫。

建立多層式解決方案和類別庫來儲存資料集 (DataEntityTier)

本逐步解說的第一個步驟是建立解決方案和兩個類別庫專案。 第一個主類別庫保存數據集(生成的具型 DataSet 類別和保存應用程式數據的 DataTable)。 此專案被用作應用程式的資料實體層,且通常位於中間層。 數據集會建立初始數據集,並將程式代碼自動分隔成兩個類別庫。

備註

按兩下 [ 確定] 之前,請務必正確命名專案和方案。 這麼做可讓您更輕鬆地完成這份指南。

建立多層式解決方案和 DataEntityTier 類別庫

  1. 在 Visual Studio 中,使用適用於 C# 或 Visual Basic 的 Windows Forms 應用程式 (.NET Framework) 專案範本建立專案。 不支援 .NET Core、.NET 5 和更新版本。

  2. 將專案命名為 DataEntityTier

  3. 將方案命名為 NTierWalkthrough,然後選擇 [ 確定]。

    系統會建立包含 DataEntityTier 專案的 NTierWalkthrough 方案,並將其新增至 方案總管

建立類別庫用來保存 TableAdapters (DataAccessTier)

建立 DataEntityTier 項目之後的下一個步驟是建立另一個類別庫專案。 此專案包含產生的 TableAdapters,稱為應用程式的 數據存取層。 數據存取層包含連線到資料庫所需的資訊,且通常位於中介層。

建立 TableAdapters 的個別類別庫

  1. 以滑鼠右鍵按兩下 方案總 管中的方案,然後選擇 [ 新增>專案]。

  2. 選擇 類別庫 (.NET Framework) 項目範本。

  3. 將專案命名為 DataAccessTier ,然後選擇 [ 確定]。

    DataAccessTier 專案會建立並新增至 NTierWalkthrough 方案。

建立數據集

下一個步驟是建立具類型的數據集。 類型化的數據集是在單一專案中建立,使用數據集類別(包括 DataTables 類別)和 TableAdapter 類別。 (所有類別都會產生成單一檔案。)當您將數據集和 TableAdapters 分隔成不同的專案時,數據集類別會移至其他專案,而TableAdapter類別則會保留在原始專案中。 因此,在專案中建立數據集,該數據集最終將包含 TableAdapter(DataAccessTier 專案)。 您可以使用 [數據源組態精靈] 建立數據集。

備註

您必須能夠存取 Northwind 範例資料庫,才能建立連線。 如需如何設定 Northwind 範例資料庫的詳細資訊,請參閱 如何:安裝範例資料庫

建立資料集

  1. 方案總管中選取 DataAccessTier

  2. 在 [ 數據] 功能表上,選取 [顯示數據源]。

    [ 數據源] 視窗隨即開啟。

  3. 在 [ 數據源] 視窗中,選取 [ 新增數據源 ] 以啟動 [數據源設定精靈]。

  4. 在 [ 選擇數據源類型 ] 頁面上,選取 [ 資料庫 ],然後選取 [ 下一步]。

  5. 在 [ 選擇您的數據連線 ] 頁面上,執行下列其中一個動作:

    如果下拉式清單中有 Northwind 範例資料庫的數據連線可用,請選取它。

    選取 [新增連線 ] 以開啟 [ 新增連接] 對話框。

  6. 如果資料庫需要密碼,請選取包含敏感數據的選項,然後選擇 [ 下一步]。

    備註

    如果您選取了本機資料庫檔案(而不是連線到 SQL Server),系統可能會詢問您是否要將檔案新增至專案。 選擇 [是 ] 將資料庫檔案新增至專案。

  7. [將連接字串儲存至應用程式組態檔] 頁面上,選取 [下一步]。

  8. 展開 選擇資料庫物件 頁面上的 資料表 節點。

  9. 選取 [客戶 ] 和 [訂單] 數據表的 複選框,然後選擇 [ 完成]。

    NorthwindDataSet 會新增至 DataAccessTier 專案,並出現在 [數據源] 視窗中。

將 TableAdapters 與數據集分開

建立數據集之後,請將產生的數據集類別與 TableAdapters 分開。 若要這樣做,您可以將 DataSet Project 屬性設定為項目的名稱,以在其中儲存分隔的數據集類別。

若要分隔 TableAdapters 與數據集

  1. 按兩下 [方案總管] 中的 NorthwindDataSet.xsd,以在數據集設計工具中開啟數據集。

  2. 選取設計工具上的空白區域。

  3. 在 [屬性] 視窗中找出 [數據集專案] 節點。

  4. [數據集專案 ] 清單中,選取 [DataEntityTier]。

  5. 在 [建置] 功能表上,選取 [建置方案]

    數據集和 TableAdapters 會分成兩個類別庫專案。 原本包含整個數據集的專案 (DataAccessTier) 現在只包含 TableAdapters。 DataSet Project 屬性中指定的專案包含類型化資料集:DataEntityTier(或NorthwindDataSet.Dataset.Designer.cs)。

備註

當您分隔數據集和 TableAdapters 時(藉由設定 DataSet Project 屬性),專案中現有的部分數據集類別將不會自動移動。 現有的數據集部分類別必須手動移至數據集專案。

建立新的服務應用程式

本逐步解說示範如何使用 WCF 服務來存取數據存取層,因此讓我們建立新的 WCF 服務應用程式。

建立新的 WCF 服務應用程式

  1. 以滑鼠右鍵按兩下 方案總 管中的方案,然後選擇 [ 新增>專案]。

  2. 在 [ 新增專案 ] 對話框的左側窗格中,選取 [WCF]。 在中間窗格中,選取 [WCF 服務連結庫]。

  3. 將專案命名為 DataService ,然後選取 [ 確定]。

    DataService 專案會建立並新增至 NTierWalkthrough 方案。

在數據存取層中建立方法,以傳回客戶和訂單數據

資料服務必須呼叫資料存取層中的兩種方法: GetCustomersGetOrders。 這些方法會傳回 Northwind CustomersOrders 數據表。 在GetCustomers專案中建立GetOrdersDataAccessTier方法。

在數據存取層中建立一個傳回 Customers 數據表的方法

  1. [方案總管] 中,按兩下 NorthwindDataset.xsd 以開啟數據集。

  2. 以滑鼠右鍵點擊 CustomersTableAdapter,然後點擊「新增查詢」。

  3. 在 [ 選擇命令類型] 頁面上,保留 [使用 SQL 語句 ] 的預設值,然後按 [ 下一步]。

  4. 在 [ 選擇查詢類型] 頁面上,保留會傳回數據 列的 SELECT 預設值,然後按 [ 下一步]。

  5. 在 [ 指定 SQL SELECT 語句] 頁面上,保留預設查詢,然後按 [下一步]。

  6. [選擇要產生的方法] 頁面上,於 傳回 DataTable 區段中,輸入 GetCustomers 作為 方法名稱

  7. 按一下完成

在數據存取層建立一個方法,該方法用於傳回 Orders 資料表。

  1. 以滑鼠右鍵按兩下 OrdersTableAdapter, 然後按兩下 [ 新增查詢]。

  2. 在 [ 選擇命令類型] 頁面上,保留 [使用 SQL 語句 ] 的預設值,然後按 [ 下一步]。

  3. 在 [ 選擇查詢類型] 頁面上,保留會傳回數據 列的 SELECT 預設值,然後按 [ 下一步]。

  4. 在 [ 指定 SQL SELECT 語句] 頁面上,保留預設查詢,然後按 [下一步]。

  5. 在 [選擇要產生的方法] 頁面上,在 [傳回 DataTable] 區段中,為 方法名稱 輸入 GetOrders

  6. 按一下完成

  7. 在 [建置] 功能表上,按一下 [建置方案]。

在數據服務中添加對數據實體和數據訪問層的引用

因為數據服務需要數據集和 TableAdapters 的資訊,因此請新增 DataEntityTierDataAccessTier 項目的參考。

若要添加數據服務的參考資料

  1. 以滑鼠右鍵按兩下 [方案總管] 中的 [DataService],然後按兩下 [新增參考]。

  2. 按兩下 [新增參考] 對話框中的 [專案] 索引標籤。

  3. 選取 DataAccessTierDataEntityTier 專案。

  4. 按一下 [確定]

將函式新增至服務,以呼叫數據存取層中的 GetCustomers 和 GetOrders 方法

現在數據存取層包含傳回數據的方法,請在數據服務中建立方法來呼叫數據存取層中的方法。

備註

針對 C# 專案,若要編譯下列程式代碼,您必須新增 System.Data.DataSetExtensions 程式集的參考。

在數據服務中建立 GetCustomers 和 GetOrders 函式

  1. DataService 專案中,按兩下 IService1.vbIService1.cs

  2. 在 [ 在這裡新增服務作業 ] 批註底下新增下列程序代碼:

    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    

    備註

    本教學課程的程式代碼適用於 C# 和 Visual Basic。 若要在 C# 和 Visual Basic 之間切換此頁面上的程式代碼語言,請使用右側頁面頂端的程式碼語言切換器。

  3. 在 DataService 專案中,按兩下 Service1.vb (或 Service1.cs)。

  4. 將下列程式代碼新增至 Service1 類別:

    public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
             CustomersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter();
        return CustomersTableAdapter1.GetCustomers();
    }
    public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
             OrdersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter();
        return OrdersTableAdapter1.GetOrders();
    }
    
  5. 在 [建置] 功能表上,按一下 [建置方案]。

建立表示層以顯示數據服務中的數據

既然解決方案包含具有方法的數據服務,其會呼叫數據存取層,請建立另一個專案來呼叫數據服務,並將數據呈現給使用者。 在此指南中,建立 Windows Forms 應用程式,這是多層式應用程式的表示層。

建立展示層專案

  1. 以滑鼠右鍵按兩下 方案總 管中的方案,然後選擇 [ 新增>專案]。

  2. 在 [ 新增專案 ] 對話框的左側窗格中,選取 [Windows 桌面]。 在中間窗格中,選取 [Windows Forms 應用程式]。

  3. 將專案命名為 PresentationTier ,然後按兩下 [ 確定]。

    PresentationTier 專案已建立並已新增至 NTierWalkthrough 解決方案。

將 PresentationTier 專案設定為啟始專案

我們將 PresentationTier 專案設定為解決方案的啟動專案,因為它是實際呈現數據並與數據互動的用戶端應用程式。

將新的表示層項目設定為啟始專案

  • 方案總管 中,按右鍵點擊 PresentationTier,然後選擇 設定為啟始專案

將參照新增至表示層

用戶端應用程式 PresentationTier 需要數據服務的服務參考,才能存取服務中的方法。 此外,必需有數據集的參考,才能啟用WCF服務的類型共用。 在您透過資料服務啟用類型共用之前,新增至部分數據集類別的程式代碼無法供表示層使用。 因為您通常會將程式碼,例如驗證程式碼,新增至資料表的資料列和資料行變更事件,所以您可能想要從用戶端存取這些程式碼。

若要新增對簡報層的參考

  1. [方案總管] 中,以滑鼠右鍵按兩下 PresentationTier ,然後選取 [新增參考]。

  2. 在 [ 新增參考] 對話框中,選取 [ 專案 ] 索引卷標。

  3. 選取 [DataEntityTier] ,然後選擇 [ 確定]。

將服務參考新增至展示層

  1. [方案總管] 中,以滑鼠右鍵按兩下 PresentationTier ,然後選取 [新增服務參考]。

  2. 在 [ 新增服務參考 ] 對話框中,選取 [ 探索]。

  3. 選取 [Service1 ],然後選擇 [ 確定]。

    備註

    如果您在目前電腦上有多個服務,請選取您先前在本逐步解說中建立的服務(包含 GetCustomersGetOrders 方法的服務)。

將 DataGridViews 新增至表單,以顯示資料服務傳回的數據

將服務參考新增至數據服務之後, [數據源 ] 視窗會自動填入服務所傳回的數據。

要將兩個資料繫結的 DataGridView 新增到表單中

  1. [方案總管] 中,選取 PresentationTier 專案。

  2. 在 [ 數據源] 視窗中,展開 [NorthwindDataSet ],然後找出 [ 客戶] 節點。

  3. [客戶] 節點拖曳至 Form1。

  4. 在 [數據源] 視窗中,展開 [客戶] 節點,然後找出相關的 [訂單] 節點([客戶] 節點中巢狀的 [訂單] 節點)。

  5. 將相關的 Orders 節點拖曳至 Form1。

  6. 按兩下表單的空白區域,以建立 Form1_Load 事件處理程式。

  7. 將下列程式代碼新增至 Form1_Load 事件處理程式。

    ServiceReference1.Service1Client DataSvc =
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

增加服務允許的訊息大小上限

的預設值 maxReceivedMessageSize 不夠大,無法保存從 CustomersOrders 數據表擷取的數據。 在下列步驟中,您會將值增加到 6553600。 您在用戶端變更值後,服務參考會自動更新。

備註

較低的預設大小旨在限制拒絕服務攻擊的風險。 如需詳細資訊,請參閱MaxReceivedMessageSize

增加 MaxReceivedMessageSize 值

  1. [方案總管] 中,按兩下PresentationTier專案中 app.config 檔案。

  2. 找出 maxReceivedMessageSize 屬性,並將值變更為 6553600。 如果您沒有看到條目basicHttpBinding,請新增一個,例如下列範例:

    <system.serviceModel>
     <bindings>
         <basicHttpBinding>
             <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" />
         </basicHttpBinding>
     </bindings>
    </system.serviceModel>
    

測試應用程式

F5 執行應用程式。 從 CustomersOrders 數據表中的數據會從數據服務中擷取,並顯示在表單上。

後續步驟

根據您的應用程式需求,在儲存 Windows 應用程式中的相關數據之後,您可能會想要執行幾個步驟。 例如,您可以對此應用程式進行下列增強功能:

  • 將驗證新增至數據集。

  • 將其他方法新增至服務,以便將數據更新回資料庫。