C#存儲過程的循序漸進

 

本文由淺入深地介紹了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","2006-9-10");    

8.                 para1=new SqlParameter("@endDate","2006-9-20");    

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值

變量保持原值

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章