在B/S开发中,难免要和数据库打交道.在客户端与服务器大量的交互过程中.数据库也在不停的忙碌着.大家知道执行I/O操作是非常耗资源的,面对有限且昂贵的数据库连接池,开发人员不得不去想如何在有限的资源来发挥更高的用户体验,其中:数据库优化是不得不考虑的因素之一,今天简单和大家说一下在ASP.net 中调用数据库存储过程,当然我们要清楚存储过程到底有什么好处呢?
使用存储过程的好处
相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:
(1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。
(2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。
(3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
(4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
由以上的分析可以看到,在应用程序中使用存储过程是很有必要的。
下面介绍一下常用的几种存储过程
(1)简单的无参数存储过程

简单存储过程
create procedure ExpOne
as
select top 10 * from Corp
go
C#调用此存储过程

C#调用上面存储过程
SqlConnection con = new SqlConnection(connstr);
string procedurestr = "存储过程名";
SqlCommand cmd = new SqlCommand(procedurestr, con);
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
i = cmd.ExecuteNonQuery();//这里是返回一个最后一次执行所影响的行数.
//如果行数没有受影响,返回 -1.
con.Close();
(2)通过存储过程使用隐式内联参数

隐式内联参数存储过程
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER procedure [dbo].[GetCorp]
@id int
as
select * from Corp where id=@id
C#中调用上面的存储过程

调用上面存储过程
SqlConnection con = new SqlConnection(connstr);
string sqltext = "存储过程名";
SqlCommand cmd = new SqlCommand(sqltext, con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p = new SqlParameter("@id", DbType.Int32);
p.Direction = ParameterDirection.Input;
p.Value = 1739;
cmd.Parameters.Add(p);
con.Open();
SqlDataReader sdr = cmd.ExecuteReader();
if (sdr.Read())

{
rtn = sdr["UserName"].ToString() + sdr["CorpName"].ToString() + sdr["Intro"].ToString();
}
sdr.Close();
con.Close();
从上面代码可以看出,但参数个数非常多的时候其实也是非常麻烦的,目前还没有找到好的解决办法,大家可以使用参数数组,如果有更好的办法欢迎一起探讨.

使用参数数组

SqlParameter[] p =
{ new SqlParameter("@id", SqlDbType.Int, 4), new SqlParameter("@UserName", SqlDbType.NVarChar, 50) };
p[0].Value = 1739;
p[0].Direction = ParameterDirection.Input; //这里可以写,也可以不写.默认为 Input.

p[1].Direction = ParameterDirection.Input; /**/////这里可以写,也可以不写.默认为 Input.

foreach (SqlParameter pm in p)

{
cmd.Parameters.Add(pm);
}
(3)通过存储过程调用显式的参数

存储过程调用显式参数
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER procedure [dbo].[GetMyCorp]
@id int,@UserName nvarchar(50) output
as
select @UserName=UserName from t_jc_corp where id=@id
在asp.net 中调用该存储过程 得到输出参数 @UserName

调用上面存储过程
SqlConnection con = new SqlConnection(connstr);
con.Open();
string procedurename = "GetMyCorp";
SqlCommand cmd = new SqlCommand(procedurename, con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter();
p1 = cmd.Parameters.Add("@id",SqlDbType.Int,4);
p1.Direction = ParameterDirection.Input;
p1.Value = 1739;

SqlParameter p2 = new SqlParameter();
p2 = cmd.Parameters.Add("@UserName", SqlDbType.NVarChar, 50);
p2.Direction = ParameterDirection.Output;

SqlDataReader sdr = cmd.ExecuteReader();
sdr.Close();
rtn = p2.Value.ToString();//rtn 就是我们要从存储过程中返回的参数 UserName
posted @ 2008-12-26 18:45 盖盖头 阅读(163) 评论(0)
编辑