關於存儲過程的介紹大家想必也不陌生了吧。大家可以參考《淺談存儲過程》一文,這裡不做介紹。
今天要介紹的是在C#裡如何調用帶輸入輸出參數的存儲過程。譬如實現簡單的登陸功能,根據用戶輸入的用戶名、用戶密碼及用戶權限實現登陸。這裡充當輸入參數的有:用戶名、用戶密碼、登陸權限。充當輸出參數的就是在數據庫裡面根據輸入參數的信息查詢數據庫中是否有記錄。具體來說就是記錄的行數。
數據庫中的存儲過程構建代碼:
Code
1use Hotel --數據庫名
2if exists(select * from sysobjects where name='proc_userinfo')--判斷是否存在存儲過程
3drop proc proc_userinfo --若存在刪除此存儲過程
4go
5--創建存儲過程
6create proc proc_userinfo
7@username varchar(50),--輸入參數
8@pwd varchar(50),--輸入參數
9@grade varchar(20),--輸入參數
10@count int output --輸出參數output不能少
11--sql語句
12as
13select @count=count(*) from userinfo where username=@username and pwd=@pwd and @grade=grade
14go
15
16
17執行存儲過程
18declare @n int
19exec proc_userinfo admin,123,管理員,@n output
20--output不能少
21print @n
22go
數據訪問層代碼
Code
1//調用存儲過程執行類似於
2//select count(*) from userinfo where username=username and pwd=pwd and grade=grade
3//接受三個參數分別用來表示用戶名、用戶密碼、用戶權限
4public bool GetUserinfo(string username,string pwd,string grade)
5 {
6 //獲取連接字符串
7 private string connstring = ConfigurationManager.ConnectionStrings["connstring"].ToString();
8 int n = 0;//查詢後返回的行數保存存儲過程中的輸出參數
9 //創建連接對象 using代碼片段好處在於離開作用域後立刻從內存中釋放對象
10 using (SqlConnection con=new SqlConnection(connstring))
11 {
12 con.Open();//打開數據庫連接
13 using (SqlCommand cmd=new SqlCommand("proc_userinfo",con))
14 {
15 //什麼作用不記得了只記得調用存儲過程該語句不能少
16 cmd.CommandType = CommandType.StoredProcedure;
17 //添加存儲過程輸入輸出參數類型及輸入參數值
18 cmd.Parameters.Add("@username", SqlDbType.VarChar, 50).Value=username;
19 cmd.Parameters.Add("@pwd", SqlDbType.VarChar, 50).Value=pwd;
20 cmd.Parameters.Add("@grade", SqlDbType.VarChar, 50).Value=grade;
21 cmd.Parameters.Add("@count", SqlDbType.Int);
22 cmd.Parameters["@username"].DbType = DbType.String;
23 //指定參數類型是輸入參數還是輸出參數
24 cmd.Parameters["@username"].Direction = ParameterDirection.Input;
25 cmd.Parameters["@pwd"].DbType = DbType.String;
26 //指定參數類型是輸入參數還是輸出參數
27 cmd.Parameters["@pwd"].Direction = ParameterDirection.Input;
28 cmd.Parameters["@grade"].DbType = DbType.String;
29 //指定參數類型是輸入參數還是輸出參數
30 cmd.Parameters["@grade"].Direction = ParameterDirection.Input;
31 cmd.Parameters["@count"].DbType = DbType.Int32;
32 //指定參數類型是輸入參數還是輸出參數
33 cmd.Parameters["@count"].Direction = ParameterDirection.Output;
34 //執行存儲過程 此處類似於查詢語句
35 cmd.ExecuteScalar();
36 //接受執行存儲過程後的返回值
37 n = (int)cmd.Parameters["@count"].Value;
38 //根據返回值判斷數據庫中是否存在對應用戶名密碼及用戶權限的記錄
39 if (n==1)
40 {
41 return true;
42 }
43 else
44 {
45 return false;
46 }
47 }
48 }
49 }
至於業務邏輯層及表示層這裡就不做介紹了,想必大家都知道該怎麼寫了。
注:這裡補充點關於清空DataGradeVIEw中所有數據的方法
Code
1//用dataGradeView.DataSource dataGradeVIEw的數據源創建一個DataTable 對象 需要強轉成DataTable
2
3 DataTable dt=(DataTable )dataGradeVIEw.DataSource;
4 //dataGradeView為具體的dataGradeVIEw
5
6 dt.Rows.Clean(); //刪除表中的行
7
8 dataGradeVIEw.DataSource=dt;
9//再把dt綁定到dataGradeVIEw上即可
10