共用方式為


逐步解說:自訂實體類別的插入、更新和刪除行為

注意

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

Visual Studio 中的 LINQ to SQL 工具提供視覺化設計介面,用以建立和編輯以資料庫物件為基礎的 LINQ to SQL 類別 (實體類別)。 透過 LINQ to SQL,您可以使用 LINQ 技術來存取 SQL 資料庫。 如需詳細資訊,請參閱 LINQ (Language Integrated Query)

執行更新的邏輯預設是由 LINQ to SQL 執行階段提供。 執行階段會根據資料表的結構描述 (資料行定義和主索引鍵資訊),建立預設的 InsertUpdateDelete 陳述式。 如果您不希望使用預設行為,則可以設定更新行為,並指定用特定的預存程序來執行處理資料庫資料時所需的插入、更新和刪除作業。 未產生預設行為時 (例如,實體類別是對應至檢視時),同樣可以這樣做。 此外,在資料庫需要透過預存程序進行資料表存取時,也可以覆寫預設更新行為。 如需詳細資訊,請參閱使用預存程序自訂作業

注意

此逐步解說需要使用 Northwind 資料庫的 InsertCustomerUpdateCustomerDeleteCustomer 預存程序。

這個逐步解說提供覆寫預設 LINQ to SQL 執行階段行為,以使用預存程序將資料儲存回資料庫的必要步驟。

在此逐步解說中,您要了解如何執行下列工作:

  • 建立新的 Windows Forms 應用程式,並在其中加入 LINQ to SQL 檔案。

  • 建立對應至 Northwind Customers 資料表的實體類別。

  • 建立參考 LINQ to SQL Customer 類別的物件資料來源。

  • 建立 Windows Forms,這個 Windows Forms 包含繫結至 Customer 類別的 DataGridView

  • 實作表單的儲存功能。

  • 將預存程序加入至 O/R 設計工具以建立 DataContext 方法。

  • 設定 Customer 類別,以使用預存程序來執行插入、更新和刪除作業。

必要條件

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

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

  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 資料庫。

建立應用程式和新增 LINQ to SQL 類別

因為您會使用 LINQ to SQL 類別並將資料顯示在 Windows Forms 上,所以請建立新的 Windows Forms 應用程式並加入 LINQ to SQL 類別檔案。

注意

在本文的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置。 您使用的可能是不同版本的 Visual Studio 或不同的環境設定。 如需詳細資訊,請參閱將 IDE 個人化

若要建立內含 LINQ to SQL 類別的新 Windows Forms 應用程式專案

  1. 在 Visual Studio 的 [檔案] 功能表上,選取 [新增]>[專案]

  2. 在左側窗格中展開 Visual C#Visual Basic,然後選取 [Windows 桌面]

  3. 在中間窗格中,選取 [Windows Forms 應用程式] 專案類型。

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

    UpdatingWithSProcsWalkthrough 專案已建立並新增至 [方案總管] 中。

  5. 在 [專案] 功能表上,按一下 [加入新項目]

  6. 按一下 [LINQ to SQL 類別] 範本,並在 [名稱] 方塊中鍵入 Northwind.dbml

  7. 按一下新增

    專案中隨即加入空的 LINQ to SQL 類別檔案 (Northwind.dbml),並開啟 O/R 設計工具

建立 Customer 實體類別和物件資料來源

將資料表從 [伺服器總管] 或 [資料庫總管] 拖曳至 O/R 設計工具,就可以建立對應至資料庫資料表的 LINQ to SQL 類別。 結果會產生對應至資料庫中各資料表的 LINQ to SQL 實體類別。 建立實體類別之後,實體類別就和其他具有公用 (Public) 屬性的類別一樣,可以當成物件資料來源使用。

若要建立 Customer 實體類別和將它設為資料來源

  1. 在 [伺服器總管] 或 [資料庫總管] 中,於 SQL Server 版的 Northwind 範例資料庫中尋找 Customer 資料表。

  2. 將 [Customers] 節點從 [伺服器總管] 或 [資料庫總管] 拖曳至 O/R 設計工具介面。

    會建立名為 Customer 的實體類別。 它的屬性會對應至 Customers 資料表中的各資料行。 因為這個實體類別代表 Customers 資料表中的單一客戶,所以其名稱為 Customer (而非 Customers)。

    注意

    此重新命名的行為稱為「複數表示」。 您可以在 [選項] 對話方塊中開啟或關閉這個行為。 如需詳細資訊,請參閱如何:開啟和關閉複數表示 (O/R 設計工具)

  3. 按一下 [建置] 功能表上的 [建置 UpdatingwithSProcsWalkthrough] 以建置專案。

  4. 若要開啟 [資料來源] 視窗,請按一下 [資料] 功能表上的 [顯示資料來源]

  5. 在 [ 資料來源 ] 視窗中,按一下 [ 加入新資料來源]。

  6. 按一下 [選擇資料來源類型] 頁面上的 [物件],然後選取 [下一步]

  7. 展開 [UpdatingwithSProcsWalkthrough] 節點,然後尋找並選取 [Customer] 類別。

    注意

    如果客戶類別無法使用,請取消精靈、建置專案,然後再次執行精靈。

  8. 按一下 [完成] 以建立資料來源,然後將 [客戶] 實體類別新增至 [資料來源] 視窗。

建立 DataGridView 以便在 Windows Forms 上顯示客戶資料

將 LINQ to SQL 資料來源項目從 [資料來源] 視窗拖曳至 Windows Forms,就可以建立繫結至實體類別的控制項。

若要加入繫結至實體類別的控制項

  1. 在設計檢視中開啟 [Form1]

  2. 將 [Customer] 節點從 [資料來源] 視窗拖曳至 [Form1]

    注意

    若要顯示 [資料來源] 視窗,請按一下 [資料] 功能表上的 [顯示資料來源]

  3. 在 [程式碼編輯器] 中開啟 [Form1]

  4. 將下列程式碼加入至表單的全域範圍中,意即不要指定特定的方法,但要屬於 Form1 類別的一部分:

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. 建立 Form_Load 事件的事件處理常式,並將下列程式碼加入至處理常式中:

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

實作儲存功能

預設不會啟用儲存按鈕,也不會實作儲存功能。 同時,為物件資料來源建立資料繫結控制項時,並不會自動加入程式碼以將變更的資料儲存至資料庫。 本節說明如何啟用儲存按鈕並實作 LINQ to SQL 物件的儲存功能。

若要實作儲存功能

  1. 在設計檢視中開啟 [Form1]

  2. 選取 CustomerBindingNavigator 上的儲存按鈕 (具有磁碟片圖示的按鈕)。

  3. 在 [屬性] 視窗中,將 [Enabled] 屬性設定為 [True]

  4. 按兩下儲存按鈕以建立事件處理常式,並切換至 [色彩編輯器]。

  5. 將下列程式碼加入至儲存按鈕事件處理常式:

    northwindDataContext1.SubmitChanges();
    

覆寫執行更新 (插入、更新和刪除) 的預設行為

若要覆寫預設更新行為

  1. O/R 設計工具中開啟 LINQ to SQL 檔案。 (按兩下 [方案總管] 中的 Northwind.dbml 檔案。)

  2. 在 [伺服器總管] 或 [資料庫總管] 中展開 Northwind 資料庫的 [預存程序] 節點,找到 InsertCustomersUpdateCustomersDeleteCustomers 預存程序。

  3. 將這三個預存程序都拖曳至 O/R 設計工具

    預存程序會加入至方法窗格中做為 DataContext 方法。 如需詳細資訊,請參閱 DataContext 方法 (O/R 設計工具)

  4. 選取 O/R 設計工具中的客戶實體類別。

  5. 選取 [屬性] 視窗中的 [Insert] 屬性。

  6. 按一下 [使用執行階段] 旁邊的省略符號 (...),以開啟 [設定行為] 對話方塊。

  7. 選取自訂

  8. 選取 [自訂] 清單中的 [InsertCustomers] 方法。

  9. 按一下 [套用] 儲存所選類別和行為的設定。

    注意

    完成每一項變更後按一下 [套用],即可繼續設定每個類別/行為組合的行為。 如果您在按一下 [套用] 之前變更了類別或行為,則會出現警告對話方塊,讓您可以套用任何變更。

  10. 選取 [行為] 清單中的 [更新]

  11. 選取自訂

  12. 選取 [自訂] 清單中的 [UpdateCustomers] 方法。

    檢查 [方法引數] 和 [類別屬性] 清單會發現資料表的某些資料行會有兩個 [方法引數] 和兩個 [類別屬性]。 這樣可以更容易追蹤變更,並建立陳述式來檢查並行違規。

  13. 將 [Original_CustomerID] 方法引數對應至 [CustomerID (Original)] 類別屬性。

    注意

    根據預設,方法引數會對應至同名的類別屬性。 如果屬性名稱變更,使得資料表與實體類別之間不再對應,則您可能需要選取當 O/R 設計工具無法判斷正確的對應時,所要對應的對等類別屬性。 此外,如果方法引數沒有可對應的有效類別屬性,可以將 [類別屬性] 值設定為 [(無)]

  14. 按一下 [套用] 儲存所選類別和行為的設定。

  15. 選取 [行為] 清單中的 [刪除]

  16. 選取自訂

  17. 選取 [自訂] 清單中的 [DeleteCustomers] 方法。

  18. 將 [Original_CustomerID] 方法引數對應至 [CustomerID (Original)] 類別屬性。

  19. 按一下 [確定]。

注意

雖然這在本特定逐步解說中不會構成問題,仍不建議 LINQ to SQL 在插入和更新期間,針對識別 (自動遞增)、rowguidcol (資料庫產生的全域唯一識別碼 (GUID)) 和時間戳記資料行自動處理資料庫產生的值。 其他資料行型別的資料庫產生值將非預期地產生 null 值。 若要傳回資料庫產生的值,您應該手動將 IsDbGenerated 設定為 true,並將 AutoSync 設定為下列其中一項:AutoSync.AlwaysAutoSync.OnInsertAutoSync.OnUpdate

測試應用程式

再次執行應用程式,確認 UpdateCustomers 預存程序已正確更新資料庫中的客戶記錄。

  1. 請按 F5

  2. 修改方格內的記錄,以測試更新行為。

  3. 新增記錄,以測試插入行為。

  4. 按一下儲存按鈕,將變更儲存回資料庫。

  5. 關閉表單。

  6. F5,確認更新的記錄和剛插入的記錄確實存在。

  7. 刪除您在步驟 3 建立的新記錄,以測試刪除行為。

  8. 按一下儲存按鈕送出變更並從資料庫中移除刪除的記錄。

  9. 關閉表單。

  10. F5 並確認已從資料庫中移除刪除的記錄。

    注意

    如果應用程式使用 SQL Server Express Edition,則根據資料庫檔案 [複製到輸出目錄] 屬性值的不同,在步驟 10 按 [F5] 時,變更可能不會出現。

下一步

根據應用程式需求的不同,在建立 LINQ to SQL 實體類別之後,您可能會想執行幾個步驟。 您可以進行下列作業讓此應用程式發揮更強的功能: