呼叫 SQL Server 預存程序,取得 `RETURN` 值或 `OUTPUT` 參數。
CREATE PROCEDURE usp_InsertUser
@Name NVARCHAR(50),
@Email NVARCHAR(100),
@NewId INT OUTPUT
AS
BEGIN
INSERT INTO Users(Name, Email) VALUES(@Name, @Email);
SET @NewId = SCOPE_IDENTITY();
RETURN 0; -- 成功返回 0
END
using System;
using System.Data;
using System.Data.SqlClient;
public int InsertUser(string name, string email)
{
using (var conn = new SqlConnection("Server=.;Database=TestDB;Integrated Security=true;"))
using (var cmd = new SqlCommand("usp_InsertUser", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// 輸入參數
cmd.Parameters.AddWithValue("@Name", name);
cmd.Parameters.AddWithValue("@Email", email);
// 輸出參數:必須指定 Direction 和 Size (字串型別)
var pNewId = new SqlParameter("@NewId", SqlDbType.Int)
{
Direction = ParameterDirection.Output
};
cmd.Parameters.Add(pNewId);
// 返回值參數:參數名固定為 @RETURN_VALUE (或不指定名稱)
var pReturn = new SqlParameter("@RETURN_VALUE", SqlDbType.Int)
{
Direction = ParameterDirection.ReturnValue
};
cmd.Parameters.Add(pReturn);
conn.Open();
cmd.ExecuteNonQuery();
// 讀取輸出參數
int newId = (int)pNewId.Value;
int returnCode = (int)pReturn.Value;
Console.WriteLine($"新用戶 ID: {newId}, 返回碼: {returnCode}");
return newId;
}
}
| 參數類型 | Direction | 參數名 | 備註 |
|---|---|---|---|
| 輸入 | `ParameterDirection.Input` (預設) | @ParamName | `AddWithValue` 可用 |
| 輸出 | `ParameterDirection.Output` | @ParamName | **必須** `new SqlParameter` 設定 Direction,字串型別需指定 `Size` |
| 雙向 | `ParameterDirection.InputOutput` | @ParamName | 先傳入值,執行後被覆寫 |
| 返回值 | `ParameterDirection.ReturnValue` | `@RETURN_VALUE` (慣例) | 對應 `RETURN @int`,僅支援 `int` |
var p = new DynamicParameters();
p.Add("@Name", name);
p.Add("@Email", email);
p.Add("@NewId", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@RETURN_VALUE", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
conn.Execute("usp_InsertUser", p, commandType: CommandType.StoredProcedure);
int newId = p.Get("@NewId");
// EF Core 不直接支援 SP Output 參數,建議改用 OUTPUT INSERT 子句
var id = await _context.Database.ExecuteSqlRawAsync(
"INSERT INTO Users(Name, Email) OUTPUT INSERTED.Id VALUES(@p0, @p1)", name, email);
**`SqlParameter.Direction = ParameterDirection.Output/ReturnValue`** 是核心。務必在 `ExecuteNonQuery()` **之後**讀取 `.Value`。現代專案優先用 Dapper 或 EF Core `OUTPUT` 子句,減少手寫 ADO.NET 樣板代碼。