如何在C#中使用存儲過程(SQL Server 2000)
要在C#中使用存儲過程,首先看看test表的創(chuàng)建sql語句:
- create table test55
- (
- uid int identity(1,1),
- class1 varchar(20),
- class2 varchar(20),
- uname varchar(20),
- birth smalldatetime,
- meno varchar(50)
- )
- alter table test55
- add constraint primary_id primary key(uid)
創(chuàng)建一個有輸入、輸出、返回值參數(shù)的存儲過程:
create proc proc_out @uid int,@output varchar(200) output
as
--select結(jié)果集
select * from test where uid>@uid
--對輸出參數(shù)進行賦值
set @output='記錄總數(shù):'+convert(varchar(10),(select count(*) from test))
--使用return,給存儲過程一個返回值。
return 200;
go
在C#中使用存儲過程:
使用帶有參數(shù)的sql語句
- private void sql_param()
- {
- SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=1234;database=china");
- //在sql語句當中引入了@myid參數(shù)
- string sql="select * from test where uid>@myid";
- SqlCommand comm=new SqlCommand(sql,conn);
- //使用comm的Parameters屬性的add方法,對上述的@myid參數(shù)進行定義和賦值
- //SqlDbType類提供了與SqlServer數(shù)據(jù)類型一致的數(shù)據(jù)庫類型
- SqlParameter sp=comm.Parameters.Add("@myid",SqlDbType.Int);
- sp.Value=10;//對輸入?yún)?shù)賦值
- //Command對象默認的執(zhí)行方式為Text,不寫下句亦可
- comm.CommandType=CommandType.Text;
- //將Command對象作為DataAdapter的參數(shù)傳進
- SqlDataAdapter da=new SqlDataAdapter(comm);
- DataSet ds=new DataSet();
- da.Fill(ds);
- //綁定數(shù)據(jù)到DataGrid1控件上
- this.DataGrid1.DataSource=ds;
- this.DataGrid1.DataBind();
- }
存儲過程的使用標準版
- private void sql_proc()
- {
- SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=1234;database=china");
- string sql="proc_out";
- SqlCommand comm=new SqlCommand(sql,conn);
- //把Command執(zhí)行類型改為存儲過程方式,默認為Text。
- comm.CommandType=CommandType.StoredProcedure;
- //傳遞一個輸入?yún)?shù),需賦值
- SqlParameter sp=comm.Parameters.Add("@uid",SqlDbType.Int);
- sp.Value=10;
- //定義一個輸出參數(shù),不需賦值。Direction用來描述參數(shù)的類型
- //Direction默認為輸入?yún)?shù),還有輸出參數(shù)和返回值型。
- sp=comm.Parameters.Add("@output",SqlDbType.VarChar,50);
- sp.Direction=ParameterDirection.Output;
- //定義過程的返回值參數(shù),過程執(zhí)行完之后,將把過程的返回值賦值給名為myreturn的Paremeters賦值。
- sp=comm.Parameters.Add("myreturn",SqlDbType.Int);
- sp.Direction=ParameterDirection.ReturnValue;
- //使用SqlDataAdapter將自動完成數(shù)據(jù)庫的打開和關(guān)閉過程,并執(zhí)行相應(yīng)t-sql語句或存儲過程
- //如果存儲過程只是執(zhí)行相關(guān)操作,如級聯(lián)刪除或更新,使用SqlCommand的execute方法即可。
- SqlDataAdapter da=new SqlDataAdapter(comm);
- DataSet ds=new DataSet();
- da.Fill(ds);
- //在執(zhí)行完存儲過程之后,可得到輸出參數(shù)
- string myout=comm.Parameters["@output"].Value.ToString();
- //打印輸出參數(shù):
- Response.Write("打印輸出參數(shù):"+myout);
- //打印存儲過程返回值
- myout=comm.Parameters["myreturn"].Value.ToString();
- Response.Write("存儲過程返回值:"+myout);
- this.DataGrid1.DataSource=ds;
- this.DataGrid1.DataBind();
- }
存儲過程的使用最簡版:
- private void sql_jyh()
- {
- //最簡寫法,把存儲過程當作t-sql語句來使用,語法為:exec 過程名 參數(shù)
- SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=1234;database=china");
- string sql="execute proc_out 10,'12'";
- SqlCommand comm=new SqlCommand(sql,conn);
- //使用SqlDataAdapter將自動完成數(shù)據(jù)庫的打開和關(guān)閉過程,并執(zhí)行相應(yīng)t-sql語句或存儲過程
- //如果存儲過程只是執(zhí)行相關(guān)操作,如級聯(lián)刪除或更新,使用SqlCommand的execute方法即可。
- SqlDataAdapter da=new SqlDataAdapter(comm);
- DataSet ds=new DataSet();
- da.Fill(ds);
- //綁定數(shù)據(jù)
- this.DataGrid1.DataSource=ds;
- this.DataGrid1.DataBind();
- }
總結(jié)與理解
SqlCommand類,提供了對t-sql語句和存儲過程的執(zhí)行能力;它不只能執(zhí)行某一個sql語句,亦可執(zhí)行一組sql語句,如創(chuàng)建表,修改表等,可以這樣理解,對于sql server而言,只要在查詢分析器中可執(zhí)行的一組語句,通過SqlCommand同樣能得到很好的執(zhí)行。SqlCommand默認執(zhí)行方式,是執(zhí)行t-sql語句,即comm.CommandType=CommandType.Text。在執(zhí)行存儲過程時,可以用"exec 過程名 參數(shù)"的形式,將其作為t-sql語句,來執(zhí)行,也可以將SqlCommand的執(zhí)行方式改為執(zhí)行過程方式,即comm.CommandType=CommandType.StoredProcedure;兩種執(zhí)行存儲過程方式的主要區(qū)別是,前者在獲得輸出參數(shù)和返回值上,很困難;后者是全面的,也是微軟專門為執(zhí)行存儲過程而定義的全面策略。
以上就是在C#中使用存儲過程的方法。
【編輯推薦】