①为什么要使用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值 |
变量保持原值 |