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