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