在使用
NET的过程中
数据库访问是一个很重要的部分
特别是在B/S系统的构建过程中
数据库操作几乎成为了一个必不可少的操作
调用存储过程实现数据库操作使很多程序员使用的方法
而且大多数的程序员都是能使用存储过程就使用存储过程
很少直接使用SQL语句
所以存储过程是很有用而且很重要的
存储过程简介
简单的说存储过程是由一些SQL语句和控制语句组成的被封装起来的过程它驻留在数据库中可以被客户应用程序调用也可以从另一个过程或触发器调用它的参数可以被传递和返回与应用程序中的函数过程类似存储过程可以通过名字来调用而且它们同样有输入参数和输出参数
根据返回值类型的不同我们可以将存储过程分为三类返回记录集的存储过程 返回数值的存储过程(也可以称为标量存储过程)以及行为存储过程顾名思义返回记录集的存储过程的执行结果是一个记录集典型的例子是从数据库中检索出符合某一个或几个条件的记录返回数值的存储过程执行完以后返回一个值例如在数据库中执行一个有返回值的函数或命令最后行为存储过程仅仅是用来实现数据库的某个功能而没有返回值例如在数据库中的更新和删除操作
使用存储过程的好处
相对于直接使用SQL语句在应用程序中直接调用存储过程有以下好处
()减少网络通信量调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别可是如果存储过程包含上百行SQL语句那么其性能绝对比一条一条的调用SQL语句要高得多
()执行速度更快有两个原因首先在存储过程创建的时候数据库已经对其进行了一次解析和优化其次存储过程一旦执行在内存中就会保留一份这个存储过程这样下次再执行同样的存储过程时可以从内存中直接调用
()更强的适应性由于存储过程对数据库的访问是通过存储过程来进行的因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动而这些改动不会对应用程序造成影响
() 布式工作应用程序和数据库的编码工作可以分别独立进行而不会相互压制
由以上的分析可以看到在应用程序中使用存储过程是很有必要的
两种不同的存储过程调用方法
为了突出新方法的优点首先介绍一下在NET中调用存储过程的官方方法另外本文的所有示例程序均工作于SqlServer数据库上其它情况类似以后不再一一说明本文所有例子均采用C#语言
要在应用程序中访问数据库一般性的步骤是首先声明一个数据库连接SqlConnection然后声明一个数据库命令SqlCommand用来执行SQL语句和存储过程有了这两个对象后就可以根据自己的需要采用不同的执行方式达到目的需要补充的是不要忘记在页面上添加如下的引用语句using SystemDataSqlClient
就执行存储过程来说如果执行的是第一类存储过程那么就要用一个DataAdapter将结果填充到一个DataSet中然后就可以使用数据网格控件将结果呈现在页面上了如果执行的是第二和第三种存储过程则不需要此过程只需要根据特定的返回判定操作是否成功完成即可
()执行一个没有参数的存储过程的代码如下
SqlConnection conn=new SqlConnection(connectionString);SqlDataAdapter da = new SqlDataAdapter();
daSelectCommand = new SqlCommand();
daSelectCommandConnection = conn;
daSelectCommandCommandText = NameOfProcedure;
daSelectCommandCommandType = CommandTypeStoredProcedure;
然后只要选择适当的方式执行此处过程用于不同的目的即可
()执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate))
SqlConnection conn=new SqlConnection(connectionString);SqlDataAdapter da = new SqlDataAdapter();
daSelectCommand = new SqlCommand();
daSelectCommandConnection = conn;
daSelectCommandCommandText = NameOfProcedure;
daSelectCommandCommandType = CommandTypeStoredProcedure;
(以上代码相同以下为要添加的代码)
param = new SqlParameter(@ParameterName SqlDbTypeDateTime);
paramDirection = ParameterDirectionInput;
paramValue = ConvertToDateTime(inputdate);
daSelectCommandParametersAdd(param);
这样就添加了一个输入参数若需要添加输出参数
param = new SqlParameter(@ParameterName SqlDbTypeDateTime);paramDirection = ParameterDirectionOutput;
paramValue = ConvertToDateTime(inputdate);
daSelectCommandParametersAdd(param);
若要获得参储过程的返回值
param = new SqlParameter(@ParameterName SqlDbTypeDateTime);paramDirection = ParameterDirectionReturnValue;
paramValue = ConvertToDateTime(inputdate);
daSelectCommandParametersAdd(param);
从上面的代码我们可以看出当存储过程比较多或者存储过程的参数比较多时这种方法会大大影响开发的速度另外一方面如果项目比较大那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担那么有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程而且在SqlServer数据库中我们可以直接在查询分析器中敲入存储过程名(参数列表)样的字符串就可以执行存储过程那么是否可以把这种思想应用到应用程序中呢?
于是在编译器中键入相应代码这些代码是在调用不带参数的存储过程的代码的基础上改的具体代码如下
SqlConnection conn=new SqlConnection(connectionString);SqlDataAdapter da = new SqlDataAdapter();
daSelectCommand = new SqlCommand();
daSelectCommandConnection = conn;
daSelectCommandCommandText = NameOfProcedure(paraparapara);
daSelectCommandCommandType = CommandTypeStoredProcedure;
为了使代码更具有代表性要调用的存储过程的第一个和第二个参数都为字符串类型第三个参数为整型执行以后发现完全可以达到预期的效果!
两种调用方法的比较
通过比较我们可以看到第二种方法具有一个很明显的优点那就是可以提高开发速度节省开发时间而且代码容易维护在一定程度上也减少了系统大小但是由于对存储过程参数的处理比较笼统如果要获取输出参数或者得到存储过程的返回值这种方法就不能满足需要了虽然如此但是这种方法毕竟可以让开发人员少些很大一部分的代码如果不需要获取输出参数和返回值那么几乎可以做到一劳永逸因此在实际的程序开发中这种方法还是具有一定的实用价值的