①爲什麼要使用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存儲過程說明
一、表的創建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
二、創建一個有輸入、輸出、返回值參數的存儲過程:
[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
三、在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值 |
變量保持原值 |