
存储过程(简称sprocs)在任何现代数据库中都居功甚伟。查询优化器要执行大量复杂的任务,使你的查询以最高效的方式运行。存储过程将优化好的查询计划(query
plan)存储下来,不必在每次查询时都重新优化一遍。通过存储查询计划,性能得以大幅改善。仅这一点,就使存储过程成为应用程序设计过程中的不二之选。此外,存储过程还允许你控制数据的检索或更新方式。
许多开发者都有意无意地回避存储过程,因为这要求他们编写较多的代码,而非仅仅是执行一些内嵌的SQL语句。不过,由于性能上的改善,存储过程是完全值得使用的。下面来看看4个不同的存储过程:一个简单存储过程在单个结果集中返回多个记录;一个存储过程返回多个结果集;一个存储过程接受一个输入参数;最后一个存储过程通过输出参数来返回数据。
使用简单存储过程
ADO.NET包含一个SqlCommand对象(另外还有专用于OleDB、Oracle和ODBC的对象),它是和SQL Server中的存储过程进行交互的关键。首先用SqlCommand来执行一个存储过程,它使用SELECT语句返回一个或多个记录。使用SQL
Server的SQL Query Analyzer(查询分析器),切换到示范Northwind数据库,输入以下代码来创建存储过程AllProducts:
CREATE PROCEDURE AllProducts
AS
Select * from Products
使用ADO.NET,可在代码中执行一个内嵌的SELECT语句。但使用存储过程,你的ADO.NET代码看起来会稍有区别。本文用到的所有代码都包括在可下载的一个
Windows应用程序项目中。从中可找到用于当前例子的完整代码,它们与窗体上的Simple
Sproc按钮绑定。但是,我将最重要的代码单列出来,放到
清单A中。
注意我采用常规的做法创建了一个Connection和Command对象。但是,这里不是将CommandText属性设为SQL语句,而是将它设为存储过程的名称,即AllProducts。然后通知ADO.NET:CommandType是一个存储过程。
现在,我们可用Command对象的ExecuteReader方法来调用存储过程。由于存储过程AllProducts从SQL Server返回一个标准结果集,所以能将结果存储到一个DataReader对象中。接着,可用DataReader的Read方法来访问数据,这和使用内嵌SQL语句时没什么两样。到目前为止,我们所做的改动非常小,接着来看一个更复杂的例子。