資料庫預存程序 (SQL Server)
USE Hotel
IF EXISTS (SELECT * FROM sysobjects WHERE name='proc_userinfo')
DROP PROC proc_userinfo
GO
CREATE PROC proc_userinfo
@username VARCHAR(50), -- 輸入
@pwd VARCHAR(50), -- 輸入
@grade VARCHAR(20), -- 輸入
@count INT OUTPUT -- 輸出 (不可少 OUTPUT)
AS
SELECT @count = COUNT(*) FROM userinfo
WHERE username = @username AND pwd = @pwd AND grade = @grade
GO
-- 測試執行
DECLARE @n INT
EXEC proc_userinfo 'admin', '123', '管理員', @n OUTPUT
PRINT @n
資料存取層 (C#)
public bool GetUserinfo(string username, string pwd, string grade)
{
string connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
int count = 0;
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("proc_userinfo", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = username;
cmd.Parameters.Add("@pwd", SqlDbType.VarChar, 50).Value = pwd;
cmd.Parameters.Add("@grade", SqlDbType.VarChar, 50).Value = grade;
var pCount = cmd.Parameters.Add("@count", SqlDbType.Int);
pCount.Direction = ParameterDirection.Output; // 關鍵:指定輸出方向
conn.Open();
cmd.ExecuteScalar(); // 執行預存程序
count = (int)pCount.Value; // 取得輸出參數值
}
return count == 1;
}
關鍵點
CommandType.StoredProcedure 告知命令類型。
ParameterDirection.Output 標記輸出參數,否則無法回傳值。
ExecuteScalar 執行並捨棄結果集 (此處預存程序無結果集,僅輸出參數)。
- 輸出參數值在執行後透過
cmd.Parameters["@count"].Value 取得。
補充:清空 DataGridView 資料
var dt = (DataTable)dataGridView.DataSource;
dt.Rows.Clear();
dataGridView.DataSource = dt;