共用方式為


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

注意

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

「多層式架構」(N-tier) 資料應用程式是可存取資料而且分成多個邏輯層或「層級」(tier) 的應用程式。 將應用程式元件分成離散層級,可增加應用程式的可維護性和延展性。 原因是可以更輕鬆地採用套用至單一層級的新技術,而且您不需要重新設計整個方案。 多層式架構包括呈現層、中介層和資料層。 中介層通常包括資料存取層、商務邏輯層和共用元件 (如驗證 (authentication) 和驗證 (validation))。 資料層包括關聯式資料庫。 多層式架構應用程式通常會將敏感性資訊儲存至中介層的資料存取層,以與存取呈現層的使用者隔離。 如需詳細資訊,請參閱多層式架構 (N-Tier) 資料應用程式概觀

其中一種在多層式架構應用程式中分為各種層級的方式,是針對您要併入應用程式中的每個層級建立離散專案。 具類型資料集所含的 DataSet Project 屬性可以決定所產生的資料集和 TableAdapter 程式碼應該進入的專案。

此逐步解說示範如何使用 [DataSet 設計工具] 將資料集和 TableAdapter 程式碼分成離散類別庫專案。 在分隔資料集和 TableAdapter 程式碼之後,您會建立 Visual Studio 中的 Windows Communication Foundation 服務和 WCF 資料服務,以呼叫資料存取層。 最後,您將建立 Windows Forms 應用程式作為呈現層。 此層級會存取資料服務中的資料。

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

  • 新建包含多個專案的多層式架構 (N-Tier) 解決方案。

  • 將兩個類別庫專案加入至多層式架構方案。

  • 使用 [資料來源組態精靈],以建立具類型資料集。

  • 將產生的 TableAdapter 和資料集程式碼分成離散專案。

  • 建立要呼叫到資料存取層的 Windows Communication Foundation (WCF) 服務。

  • 在服務中建立函式,以擷取資料存取層中的資料。

  • 建立 Windows Forms 應用程式,以做為呈現層。

  • 建立繫結至資料來源的 Windows Form 控制項。

  • 撰寫程式碼以填入資料表。

必要條件

若要完成本教學課程,您需要在 Visual Studio 中安裝 .NET 桌面開發資料儲存和處理工作負載。 若要安裝,請開啟 Visual Studio 安裝程式並選擇您要修改 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 執行個體,然後選取 [新增查詢]

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

    2. Northwind Transact-SQL 指令碼複製到剪貼簿。 此 T-SQL 指令碼會從頭開始建立 Northwind 資料庫,並將資料填入其中。

    3. 將 T-SQL 指令碼貼入查詢編輯器中,然後選擇 [執行] 按鈕。

      查詢很快就會完成執行,並建立 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 資料庫。

建立多層式架構 (N-Tier) 解決方案和類別庫以保存資料集 (DataEntityTier)

這個逐步解說的第一個步驟是建立一個方案和兩個類別庫專案。 第一個類別庫會保存資料集 (產生的具類型 DataSet 類別以及保存應用程式資料的 DataTables)。 此專案是用做應用程式的資料實體層,而且通常位於中介層。 資料集會建立初始資料集,並自動將程式碼分成兩個類別庫。

注意

請確認正確命名專案和方案,然後按一下 [確定]。 這麼做可以讓您輕鬆地完成這個逐步解說。

建立多層式架構方案和 DataEntityTier 類別庫

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

  2. 將專案命名為 DataEntityTier

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

    隨即建立含有 DataEntityTier 專案的 NTierWalkthrough 方案,並將其新增至 [方案總管]

建立類別庫以保存 TableAdapter (DataAccessTier)

建立 DataEntityTier 專案之後的下一個步驟是建立另一個類別庫專案。 此專案保存產生的 TableAdapter,一般稱之為應用程式的資料存取層。 資料存取層包含連接至資料庫所需的資訊,而且通常位於中介層。

為 TableAdapter 建立個別的類別庫

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

  2. 選擇 [類別庫 (.NET Framework)] 專案範本。

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

    隨即建立 DataAccessTier 專案,並將它加入至 NTierWalkthrough 方案。

建立資料集

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

注意

您必須具有 Northwind 範例資料庫的存取權,才能建立連接。 如需如何設定 Northwind 範例資料庫的詳細資訊,請參閱操作說明:安裝範例資料庫

建立資料集

  1. 方案總管中選取 [DataAccessTier]

  2. 在 [資料] 功能表上,選取 [顯示資料來源]

    [資料來源] 視窗隨即開啟。

  3. 在 [資料來源] 視窗中,選取 [新增新資料來源],以啟動 [資料來源組態精靈]

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

  5. 在 [選擇資料連線] 頁面上,執行下列其中一項動作:

    如果下拉式清單中有提供 Northwind 範例資料庫的資料連線,請選取這個資料連線。

    選取 [新增連線],以開啟 [新增連線] 對話方塊。

  6. 如果資料庫需要密碼,請選取納入敏感性資料的選項,然後選擇 [下一步]

    注意

    如果您已選取本機資料庫檔案 (而非連接至 SQL Server),則系統可能會詢問您是否要將檔案加入至專案。 選擇 [是],將資料庫檔案新增至專案。

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

  8. 在 [選擇您的資料庫物件] 頁面上,展開 [資料表] 節點。

  9. 選取 [客戶] 和 [訂單] 資料表的核取方塊,然後選擇 [完成]

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

分隔 TableAdapter 與資料集

在您建立資料集之後,請分隔產生的資料集類別與 TableAdapter。 做法是將 [資料集專案] 屬性設定為在其中儲存分開之資料集類別的專案名稱。

分隔 TableAdapter 與資料集

  1. 在 [方案總管] 中,按兩下 NorthwindDataSet.xsd 開啟 [DataSet 設計工具]

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

  3. 在 [屬性] 視窗中,找到 [資料集專案] 節點。

  4. 在 [資料集專案] 清單中,選取 [DataEntityTier]

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

    資料集和 TableAdapter 會分隔到兩個類別庫專案。 原本包含整個資料集的專案 (DataAccessTier) 現在只會包含 TableAdapter。 [資料集專案] 屬性中指定的專案 (DataEntityTier) 包含具類型資料集:NorthwindDataSet.Dataset.Designer.vb (或 NorthwindDataSet.Dataset.Designer.cs)。

注意

當您分隔資料集與 TableAdapter 時 (設定 [資料集專案] 屬性),將不會自動移動專案中的現有部份資料集類別。 現有資料集部分類別必須手動移至資料集專案。

建立新的 WCF 應用程式服務

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

建立新的 WCF 應用程式服務

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

  2. 在 [新增專案] 對話方塊的左側窗格中,選取 [WCF]。 在中間窗格,選取 [WCF 服務程式庫]

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

    隨即建立 DataService 專案,並將它加入至 NTierWalkthrough 方案。

在資料存取層中建立用來傳回客戶和訂單資料的方法

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

在資料存取層中建立可傳回 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. 在 [建置] 功能表上,按一下 [建置方案]。

將資料實體和資料存取層的參考新增至資料服務

因為資料服務需要來自資料集和 TableAdapter 的資訊,所以請新增 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 Form 應用程式;這是多層式架構應用程式的呈現層。

建立呈現層專案

  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 新增至表單以顯示資料服務所傳回的資料

在您新增資料服務的服務參考之後,會將服務所傳回的資料自動填入 [資料來源] 視窗。

將兩個繫結 DataGridViews 的資料加入至表單

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

  2. 在 [資料來源] 視窗中,展開 NorthwindDataSet,並找到 [客戶] 節點。

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

  4. 在 [資料來源] 視窗中,展開 [客戶] 節點,並找到相關的 [訂單] 節點 (巢狀於 [客戶] 節點中的 [訂單] 節點)。

  5. 將相關的 [訂單] 節點拖曳至 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。 您在用戶端上變更該值,以自動更新服務參考。

注意

較小的預設大小是要限制拒絕服務 (DoS) 攻擊的機率。 如需詳細資訊,請參閱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 應用程式中的關聯資料後,可能還要執行幾個步驟。 例如,您可以對此應用程式進行下列增強:

  • 將驗證加入至資料集。

  • 將其他方法加入至服務,以將資料更新回資料庫。