在企業級應用開發中,預存程序是資料庫操作的核心技術之一。它不僅能封裝複雜的商業邏輯,還能有效防止 SQL 注入、提升執行效率。本文將以 SQL Server 2000 為例,完整示範如何建立帶輸出參數的預存程序,並透過 C# 進行呼叫與參數處理。
首先,我們建立一個簡單的登入驗證預存程序 p_Login,接收使用者帳號、密碼,並透過 OUTPUT 參數回傳查詢結果:
CREATE PROCEDURE p_Login
@UserID varchar(20), -- 使用者帳號
@PassWord varchar(20), -- 使用者密碼
@Result varchar(50) OUTPUT -- 登入結果(輸出參數)
AS
BEGIN
SELECT @Result = Name
FROM student
WHERE TestCardID = @UserID AND password = @PassWord
END
GO
關鍵點解析:
OUTPUT 關鍵字標記輸出參數,讓呼叫端能接收回傳值以下展示標準的 ADO.NET 呼叫模式,包含連線字串讀取、參數配置、執行與資源釋放:
string cnnString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
using (SqlConnection conn = new SqlConnection(cnnString))
using (SqlCommand comm = new SqlCommand("p_Login", conn))
{
comm.CommandType = CommandType.StoredProcedure;
// 輸入參數
comm.Parameters.Add("@UserID", SqlDbType.VarChar, 50).Value = userID;
comm.Parameters.Add("@PassWord", SqlDbType.VarChar, 50).Value = passWord;
// 輸出參數:必須指定 Direction
SqlParameter outputParam = comm.Parameters.Add("@Result", SqlDbType.VarChar, 50);
outputParam.Direction = ParameterDirection.Output;
conn.Open();
comm.ExecuteNonQuery(); // 執行不回傳結果集的命令
// 取得輸出參數值
return outputParam.Value?.ToString() ?? string.Empty;
}
ParameterDirection.Output 或 InputOutput?.ToString() ?? string.Empty 防止 NullReferenceException| 錯誤現象 | 可能原因 | 解決方案 |
|---|---|---|
| 回傳 null | 查無資料或欄位名錯誤 | 在 SSMS 中直接執行預存程序驗證邏輯 |
| ParameterDirection 錯誤 | 未設定 Output 方向 | 檢查 Parameters["@Result"].Direction 設定 |
| 型別不符例外 | SqlDbType 與資料庫型別不符 | 核對 VarChar/NVarChar、長度是否一致 |
掌握這套標準流程,即可在專案中安全、高效地使用預存程序進行資料存取。