CREATE PROCEDURE schema.name @param type [OUTPUT] AS BEGIN ... END-- T-SQL
CREATE PROCEDURE dbo.GetUserIDs
AS
SELECT UserID FROM Users ORDER BY UserID DESC;
C# 調用關鍵點:
using (SqlConnection conn = ADConnection.CreateConnection())
using (SqlCommand cmd = new SqlCommand("GetUserIDs", conn))
{
cmd.CommandType = CommandType.StoredProcedure; // 關鍵:聲明為存儲過程
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
// 處理 dr[0] 等列
}
}
}
本質:將原內聯 SQL 字符串替換為過程名,並設置 CommandType.StoredProcedure。
-- T-SQL
CREATE PROCEDURE dbo.GetCommentsByDateRange
@StartDate VARCHAR(16),
@EndDate VARCHAR(16)
AS
SELECT ID FROM Table_AX
WHERE CommentDateTime > @StartDate AND CommentDateTime < @EndDate
ORDER BY ContentOwnerID DESC;
C# 使用 SqlDataAdapter 填充 DataSet:
using (SqlConnection conn = ADConnection.CreateConnection())
using (SqlDataAdapter da = new SqlDataAdapter("GetCommentsByDateRange", conn))
{
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.Add(new SqlParameter("@StartDate", startDate));
da.SelectCommand.Parameters.Add(new SqlParameter("@EndDate", endDate));
DataSet ds = new DataSet();
da.Fill(ds); // 自動打開/關閉連接
return ds;
}
參數化查詢防注入,類型安全,計劃復用。
-- T-SQL
CREATE PROCEDURE dbo.UpdatePassword
@UserName NVARCHAR(20),
@Password NVARCHAR(20)
AS
DECLARE @Err INT;
UPDATE WL_User SET Password = @Password WHERE UserName = @UserName;
SET @Err = @@ERROR; -- 0 成功,非 0 失敗
RETURN @Err; -- 或 SELECT @Err AS ErrCode 輸出參數
C# 獲取返回值:
SqlParameter retParam = cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.Int);
retParam.Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
int result = (int)retParam.Value; // 0 成功
或使用 OUTPUT 參數返回更豐富信息。
using 確保連接釋放。AddWithValue 類型推斷問題。