本文由淺入深地介紹了C#存儲過程,但願對你們有所幫助。
①爲何要使用C#存儲過程?
由於它比SQL語句執行快.
②C#存儲過程是什麼?
把一堆SQL語句羅在一塊兒,還能夠根據條件執行不通SQL語句.(AX寫做本文時觀點)
③來一個最簡單的存儲過程
[xhtml] view plaincopy
1.
CREATE PROCEDURE dbo.testProcedure_AX
2.
AS
3.
select userID from USERS order by userid desc
注:dbo.testProcedure_AX是你建立的存儲過程名,能夠改成:AXzhz等,別跟關鍵字衝突就好了.AS下面就是一條SQL語句,不會寫SQL語句的請回避.
④我怎麼在ASP.Net中調用這個存儲過程?
[c-sharp] view plaincopy
1.
public static string GetCustomerCName(ref ArrayList arrayCName,ref ArrayList arrayID)
2.
{
3.
SqlConnection con=ADConnection.createConnection();
4.
SqlCommand cmd=new SqlCommand("testProcedure_AX",con);
5.
cmd.CommandType=CommandType.StoredProcedure;
6.
con.Open();
7.
try
8.
{
9.
SqlDataReader dr=cmd.ExecuteReader();
10.
while(dr.Read())
11.
{
12.
if(dr[0].ToString()=="")
13.
{
14.
arrayCName.Add(dr[1].ToString());
15.
}
16.
}
17.
con.Close();
18.
return "OK!";
19.
}
20.
catch(Exception ex)
21.
{
22.
con.Close();
23.
return ex.ToString();
24.
}
25.
}
注:其實就是把之前
[c-sharp] view plaincopy
1.
SqlCommand cmd=new SqlCommand("select userID from USERS order by userid desc",con);
中的SQL語句替換爲存儲過程名,再把cmd的類型標註爲CommandType.StoredProcedure(存儲過程)
⑤寫個帶參數的C#存儲過程吧,上面這個簡單得有點慘不忍睹,不過仍是蠻實用的.
參數帶就帶兩,一個的沒面子,過小家子氣了.
[xhtml] view plaincopy
1.
CREATE PROCEDURE dbo.AXzhz
2.
/*
3.
4.
這裏寫註釋
5.
*/
6.
7.
@startDate varchar(16),
8.
@endDate varchar(16)
9.
10.
AS
11.
select id from table_AX where commentDateTime>@startDate and commentDateTime< @endDate order by contentownerid DESC
12.
13.
注:@startDate varchar(16)是聲明@startDate 這個變量,多個變量名間用【,】隔開.後面的SQL就可使用這個變量了.
⑥我怎麼在ASP.Net中調用這個帶參數的存儲過程?
[c-sharp] view plaincopy
1.
public static string GetCustomerCNameCount(string startDate,string endDate,ref DataSet ds)
2.
{
3.
SqlConnection con=ADConnection.createConnection();
4.
//-----------------------注意這一段--------------------------------------------------------------------------------------------------------
5.
SqlDataAdapter da=new SqlDataAdapter("AXzhz",con);
6.
para0=new SqlParameter("@startDate",startDate);
7.
para1=new SqlParameter("@endDate",endDate);
8.
da.SelectCommand.Parameters.Add(para0);
9.
da.SelectCommand.Parameters.Add(para1);
10.
da.SelectCommand.CommandType=CommandType.StoredProcedure;
11.
//-------------------------------------------------------------------------------------------------------------------------------
12.
13.
try
14.
{
15.
con.Open();
16.
da.Fill(ds);
17.
con.Close();
18.
return "OK";
19.
}
20.
catch(Exception ex)
21.
{
22.
return ex.ToString();
23.
}
24.
}
注:把命令的參數添加進去,就OK了
鳥的,改字體顏色的東西太垃圾了,改很差,你們湊活着看.
⑦我還想看看SQL命令執行成功了沒有.
注意看下面三行紅色的語句
[xhtml] view plaincopy
1.
CREATE PROCEDURE dbo.AXzhz
2.
/*
3.
@parameter1 用戶名
4.
@parameter2 新密碼
5.
*/
6.
@password nvarchar(20),
7.
@userName nvarchar(20)
8.
AS
9.
declare @err0 int
10.
update WL_user set password=@password where UserName=@userName
11.
set @err0=@@error
12.
select @err0 as err0
注:先聲明一個整型變量@err0,再給其賦值爲@@error(這個是系統自動給出的語句是否執行成功,0爲成功,其它爲失敗),最後經過select把它選擇出來,某位高人說能夠經過Return返回,超出本人的認知範圍,俺暫時不會,之後再補充吧
⑧那怎麼從後臺得到這個執行成功與否的值呢?
下面這段代碼能夠告訴你答案:
[c-sharp] view plaincopy
1.
public static string GetCustomerCName()
2.
{
3.
SqlConnection con=ADConnection.createConnection();
4.
5.
SqlCommand cmd=new SqlCommand("AXzhz",con);
6.
cmd.CommandType=CommandType.StoredProcedure;
7.
para0=new SqlParameter("@startDate","
8.
para1=new SqlParameter("@endDate","
9.
da.SelectCommand.Parameters.Add(para0);
10.
da.SelectCommand.Parameters.Add(para1);
11.
con.Open();
12.
try
13.
{
14.
Int32 re=(int32)cmd.ExecuteScalar();
15.
con.Close();
16.
if (re==0)
17.
return "OK!";
18.
else
19.
return "false";
20.
}
21.
catch(Exception ex)
22.
{
23.
con.Close();
24.
return ex.ToString();
25.
}
26.
}
注:就是經過SqlCommand的ExecuteScalar()方法取回這個值,這句話是從MSDN上找的,俺認爲改爲:
int re=(int)cmd.ExecuteScalar(); 99%正確,如今沒時間驗證,期待您的測試!!!
⑨我要根據傳入的參數判斷執行哪條SQL語句!!~
下面這個存儲過程能夠知足咱們的要求,居然是Pascal/VB的寫法,Begin----End ,不是{},,,對使用C#的我來講,這個語法有點噁心.........
[xhtml] view plaincopy
1.
ALTER PROCEDURE dbo.selectCustomerCNameCount
2.
@customerID int
3.
AS
4.
if @customerID=-1
5.
begin
6.
select contentownerid ,userCName,count(*) as countAll from view_usercomment group by contentownerid,userCName order by contentownerid DESC
7.
end
8.
else
9.
begin
10.
select contentownerid ,userCName,count(*) as countAll from view_usercomment where contentownerid=@customerID group by contentownerid,userCName order by contentownerid DESC
11.
end
好了,C#存儲過程就給你們介紹到這裏,算是拋磚引玉吧!還有更多東西等着咱們去發現,無盡的征途!
第二篇:
在C#中使用SQL存儲過程說明
1、表的建立sql語句:
[xhtml] view plaincopy
1.
CREATE TABLE [tree] (
2.
[node_id] [int] NOT NULL ,
3.
[node_name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
4.
[pat_id] [int] NULL ,
5.
[url] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
6.
[icon] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
7.
[memo] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
8.
CONSTRAINT [tree_pk] PRIMARY KEY CLUSTERED
9.
(
10.
[node_id]
11.
) ON [PRIMARY]
12.
) ON [PRIMARY]
13.
GO
2、建立一個有輸入、輸出、返回值參數的存儲過程:
[xhtml] view plaincopy
1.
create proc proc_out @uid int,@output varchar(200) output
2.
3.
as
4.
5.
--select結果集
6.
7.
select * from tree where node_id>@uid
8.
9.
10.
--對輸出參數進行賦值
11.
12.
set @output='記錄總數:'+convert(varchar(10),(select count(*) from tree))
13.
14.
--使用return,給存儲過程一個返回值。
15.
16.
return 200;
17.
18.
go
3、在C#中,操做存儲過程:
3.1 使用帶有參數的sql語句
[c-sharp] view plaincopy
1.
private void sql_param()
2.
{
3.
4.
SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=sms");
5.
6.
//在sql語句當中引入了@myid參數
7.
string sql="select * from tree where uid>@myid";
8.
SqlCommand comm=new SqlCommand(sql,conn);
9.
10.
//使用comm的Parameters屬性的add方法,對上述的@myid參數進行定義和賦值
11.
//SqlDbType類提供了與SqlServer數據類型一致的數據庫類型
12.
SqlParameter sp=comm.Parameters.Add("@myid",SqlDbType.Int);
13.
sp.Value=10;//對輸入參數賦值
14.
15.
//Command對象默認的執行方式爲Text,不寫下句亦可
16.
comm.CommandType=CommandType.Text;
17.
18.
//將Command對象做爲DataAdapter的參數傳進
19.
SqlDataAdapter da=new SqlDataAdapter(comm);
20.
DataSet ds=new DataSet();
21.
da.Fill(ds);
22.
23.
//綁定數據到DataGrid1控件上
24.
this.Dgd_student.DataSource=ds;
25.
this.Dgd_student.DataBind();
26.
27.
}
3.2 存儲過程的使用標準版
[c-sharp] view plaincopy
1.
private void sql_proc()
2.
{
3.
4.
5.
SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=sms");
6.
string sql = "proc_out";
7.
SqlCommand comm = new SqlCommand(sql, conn);
8.
9.
//把Command執行類型改成存儲過程方式,默認爲Text。
10.
comm.CommandType = CommandType.StoredProcedure;
11.
12.
//傳遞一個輸入參數,需賦值
13.
SqlParameter sp = comm.Parameters.Add("@uid", SqlDbType.Int);
14.
sp.Value = 4;
15.
16.
//定義一個輸出參數,不需賦值。Direction用來描述參數的類型
17.
//Direction默認爲輸入參數,還有輸出參數和返回值型。
18.
sp = comm.Parameters.Add("@output", SqlDbType.VarChar, 50);
19.
sp.Direction = ParameterDirection.Output;
20.
21.
//定義過程的返回值參數,過程執行完以後,將把過程的返回值賦值給名爲myreturn的Paremeters賦值。
22.
sp = comm.Parameters.Add("myreturn", SqlDbType.Int);
23.
sp.Direction = ParameterDirection.ReturnValue;
24.
25.
//使用SqlDataAdapter將自動完成數據庫的打開和關閉過程,並執行相應t-sql語句或存儲過程
26.
//若是存儲過程只是執行相關操做,如級聯刪除或更新,使用SqlCommand的execute方法便可。
27.
SqlDataAdapter da = new SqlDataAdapter(comm);
28.
DataSet ds = new DataSet();
29.
da.Fill(ds);
30.
31.
32.
//在執行完存儲過程以後,可獲得輸出參數
33.
string myout = comm.Parameters["@output"].Value.ToString();
34.
35.
//打印輸出參數:
36.
Response.Write("打印輸出參數:" + myout);
37.
38.
//打印存儲過程返回值
39.
myout = comm.Parameters["myreturn"].Value.ToString();
40.
Response.Write("存儲過程返回值:" + myout);
41.
42.
this.Dgd_student.DataSource = ds;
43.
this.Dgd_student.DataBind();
44.
45.
46.
47.
}
3.3 存儲過程的使用最簡版:
[c-sharp] view plaincopy
1.
private void sql_jyh()
2.
{
3.
4.
//最簡寫法,把存儲過程看成t-sql語句來使用,語法爲:exec 過程名 參數
5.
6.
SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=SMS");
7.
string sql = "execute proc_out 3,'12'";
8.
SqlCommand comm = new SqlCommand(sql, conn);
9.
10.
//使用SqlDataAdapter將自動完成數據庫的打開和關閉過程,並執行相應t-sql語句或存儲過程
11.
//若是存儲過程只是執行相關操做,如級聯刪除或更新,使用SqlCommand的execute方法便可。
12.
SqlDataAdapter da = new SqlDataAdapter(comm);
13.
DataSet ds = new DataSet();
14.
da.Fill(ds);
15.
16.
//綁定數據
17.
this.Dgd_student.DataSource = ds;
18.
this.Dgd_student.DataBind();
19.
20.
}
帶多個參數 的狀況
[xhtml] view plaincopy
1.
create proc proc_out2 @uid int,@patid int,@output varchar(200) output
2.
3.
as
4.
5.
--select結果集
6.
7.
select * from tree where node_id>@uid and pat_id = @patid
8.
9.
10.
--對輸出參數進行賦值
11.
12.
set @output='記錄總數:'+convert(varchar(10),(select count(*) from tree))
13.
14.
--使用return,給存儲過程一個返回值。
15.
16.
return 200;
17.
18.
go
[c-sharp] view plaincopy
1.
private void More()
2.
{
3.
SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=sms");
4.
string sql = "proc_out2";
5.
SqlCommand cmd = new SqlCommand(sql, conn);
6.
//把Command執行類型改成存儲過程方式,默認爲Text。
7.
cmd.CommandType = CommandType.StoredProcedure;
8.
9.
cmd.Parameters.Add("@uid",SqlDbType.Int).Value = 1 ;
10.
cmd.Parameters.Add("@patid", SqlDbType.Int).Value = 1;
11.
cmd.Parameters.Add("@output", SqlDbType.VarChar, 100);
12.
cmd.Parameters["@output"].Direction = ParameterDirection.Output;
13.
14.
//cmd.Parameters.Add(new SqlParameter("@uid", SqlDbType.Int)).Value = 1;//"A1**";
15.
//cmd.Parameters.Add(new SqlParameter("@patid", SqlDbType.Int)).Value = 1; //"A2**";
16.
//SqlParameter param = new SqlParameter("@output", SqlDbType.VarChar, 88);
17.
//param.Direction = ParameterDirection.Output;
18.
// cmd.Parameters.Add(param);
19.
20.
//cmd.ExecuteNonQuery();
21.
DataSet ds = new DataSet();
22.
SqlDataAdapter da = new SqlDataAdapter(cmd);
23.
da.Fill(ds);
24.
string rtnstr = cmd.Parameters["@output"].Value.ToString();
25.
Response.Write("打印輸出參數:" + rtnstr);
26.
this.Dgd_student.DataSource = ds;
27.
this.Dgd_student.DataBind();
28.
}
轉自:http://blog.csdn.net/andyhooo/archive/2008/03/21/2203330.aspx
有上面兩篇文章能夠看出,存儲過程的調用其實跟t-sql差別不大,存儲過程當中能夠經過SELECT , SET , RETURN 賦值/返回結果供外面調用,具體方式有所不一樣,上面有說起。
|
set
|
select
|
同時對多個變量同時賦值
|
不支持
|
支持
|
表達式返回多個值時
|
出錯
|
將返回的最後一個值賦給變量
|
表達式未返回值
|
變量被賦null值
|
變量保持原值 |