實務專案常使用儲存程序封裝資料庫邏輯。本文示範如何在 LINQ to SQL 中對應並呼叫儲存程序,完成 Employees 資料表的 CRUD 操作。
-- (1) 查詢所有員工
CREATE PROCEDURE [dbo].[Employees_GetAll]
AS
SELECT * FROM Employees ORDER BY EmployeeID;
-- (2) 依 ID 查詢單筆
CREATE PROCEDURE [dbo].[Employees_GetByID]
@ID int
AS
SELECT * FROM Employees WHERE EmployeeID = @ID;
-- (3) 新增員工
CREATE PROCEDURE [dbo].[Employees_Insert]
@FirstName nvarchar(20),
@LastName nvarchar(20)
AS
INSERT INTO Employees (FirstName, LastName) VALUES (@FirstName, @LastName);
-- (4) 更新員工
CREATE PROCEDURE [dbo].[Employees_Update]
@ID int,
@FirstName nvarchar(20),
@LastName nvarchar(20)
AS
UPDATE Employees SET FirstName = @FirstName, LastName = @LastName WHERE EmployeeID = @ID;
Northwind.dbml 設計介面NorthwindDataContext 自動新增對應方法:Employees_GetAll()、Employees_GetByID(int)、Employees_Insert(string, string)、Employees_Update(int, string, string)
using (var db = new NorthwindDataContext()) {
// 1. 查詢所有 - 回傳 ISingleResult
var allEmps = db.Employees_GetAll().ToList();
// 2. 查詢單筆 - 回傳 ISingleResult
var emp = db.Employees_GetByID(1).FirstOrDefault();
// 3. 新增 - 回傳 int (影響列數)
int inserted = db.Employees_Insert("Jane", "Smith");
// 4. 更新 - 回傳 int
int updated = db.Employees_Update(1, "Jane", "Doe");
}
預設產生的 Result 類別名稱較長(如 Employees_GetAllResult)。可在 DBML 設計面方法屬性視窗修改 Return Type 為自訂實體類別(需欄位一致),或選擇 None 僅執行不回傳。
-- 帶 OUTPUT 參數的儲存程序範例
CREATE PROCEDURE [dbo].[Employees_InsertWithID]
@FirstName nvarchar(20),
@LastName nvarchar(20),
@NewID int OUTPUT
AS
INSERT INTO Employees (FirstName, LastName) VALUES (@FirstName, @LastName);
SET @NewID = SCOPE_IDENTITY();
拖曳至 DBML 後,產生的方法簽名為:
int Employees_InsertWithID(string firstName, string lastName, ref int newID)
呼叫方式:
int newId = 0;
db.Employees_InsertWithID("Bob", "Wilson", ref newId);
// newId 即為資料庫自動產生的 EmployeeID
using (var db = new NorthwindDataContext()) {
db.Connection.Open();
var tx = db.Connection.BeginTransaction();
db.Transaction = tx;
try {
db.Employees_Insert("A", "B");
db.Employees_Update(2, "C", "D");
tx.Commit();
} catch {
tx.Rollback();
throw;
}
}
db.Log = Console.Out 觀察產生的 SQLIMultipleResults 依序取得