在C#中使用存儲過程<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文以Sql Server2000爲例,示例數據庫爲china,表爲test,來說明以C#中使用sql存儲過程的方法。
一、test表的創建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)
二、創建一個有輸入、輸出、返回值參數的存儲過程:
create proc proc_out @uid int,@output varchar(200) output
as
--select結果集
select * from test where uid>@uid
--對輸出參數進行賦值
set @output='記錄總數:'+convert(varchar(10),(select count(*) from test))
--使用return,給存儲過程一個返回值。
return 200;
go
三、在C#中,操作存儲過程:
3.1 使用帶有參數的sql語句
private void sql_param()
{
SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=1234;database=china");
//在sql語句當中引入了@myid參數
string sql="select * from test where uid>@myid";
SqlCommand comm=new SqlCommand(sql,conn);
//使用comm的Parameters屬性的add方法,對上述的@myid參數進行定義和賦值
//SqlDbType類提供了與SqlServer數據類型一致的數據庫類型
SqlParameter sp=comm.Parameters.Add("@myid",SqlDbType.Int);
sp.Value=10;//對輸入參數賦值
//Command對象默認的執行方式爲Text,不寫下句亦可
comm.CommandType=CommandType.Text;
//將Command對象作爲DataAdapter的參數傳進
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds);
//綁定數據到DataGrid1控件上
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
}
3.2 存儲過程的使用標準版
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執行類型改爲存儲過程方式,默認爲Text。
comm.CommandType=CommandType.StoredProcedure;
//傳遞一個輸入參數,需賦值
SqlParameter sp=comm.Parameters.Add("@uid",SqlDbType.Int);
sp.Value=10;
//定義一個輸出參數,不需賦值。Direction用來描述參數的類型
//Direction默認爲輸入參數,還有輸出參數和返回值型。
sp=comm.Parameters.Add("@output",SqlDbType.VarChar,50);
sp.Direction=ParameterDirection.Output;
//定義過程的返回值參數,過程執行完之後,將把過程的返回值賦值給名爲myreturn的Paremeters賦值。
sp=comm.Parameters.Add("myreturn",SqlDbType.Int);
sp.Direction=ParameterDirection.ReturnValue;
//使用SqlDataAdapter將自動完成數據庫的打開和關閉過程,並執行相應t-sql語句或存儲過程
//如果存儲過程只是執行相關操作,如級聯刪除或更新,使用SqlCommand的execute方法即可。
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds);
//在執行完存儲過程之後,可得到輸出參數
string myout=comm.Parameters["@output"].Value.ToString();
//打印輸出參數:
Response.Write("打印輸出參數:"+myout);
//打印存儲過程返回值
myout=comm.Parameters["myreturn"].Value.ToString();
Response.Write("存儲過程返回值:"+myout);
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
}
3.3 存儲過程的使用最簡版:
private void sql_jyh()
{
//最簡寫法,把存儲過程當作t-sql語句來使用,語法爲:exec 過程名 參數
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將自動完成數據庫的打開和關閉過程,並執行相應t-sql語句或存儲過程
//如果存儲過程只是執行相關操作,如級聯刪除或更新,使用SqlCommand的execute方法即可。
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds);
//綁定數據
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
}
四、總結與理解:
SqlCommand類,提供了對t-sql語句和存儲過程的執行能力;它不只能執行某一個sql語句,亦可執行一組sql語句,如創建表,修改表等,可以這樣理解,對於sql server而言,只要在查詢分析器中可執行的一組語句,通過SqlCommand同樣能得到很好的執行。SqlCommand默認執行方式,是執行t-sql語句,即comm.CommandType=CommandType.Text。在執行存儲過程時,可以用"exec 過程名 參數"的形式,將其作爲t-sql語句,來執行,也可以將SqlCommand的執行方式改爲執行過程方式,即comm.CommandType=CommandType.StoredProcedure;兩種執行存儲過程方式的主要區別是,前者在獲得輸出參數和返回值上,很困難;後者是全面的,也是微軟專門爲執行存儲過程而定義的全面策略。