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值

变量保持原值

 

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