本文由浅入深地介绍了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值
|
变量保持原值 |