注意:就像在上一章探讨的一样,当从一个客户端程序——比如一个ASP.NET website,调试一个SQL Server对象时,我们需要关闭连接池。上面的连接字符串里我们关闭了连接池(“Pooling=false”). 如果你不打算从ASP.NET website调试管理存储过程和用户自定义函数的话,激活连接池.
第三步:创建一个Managed Stored Procedure
要向Northwind数据库添加一个管理存储过程的话,我们首先要创建一个存储过程作为该SQL Server Project里的一个方法。从解决资源管理器里,右键单击 ManagedDatabaseConstructs工程,选“添加新项”,这将展示Add New Item 对话框,其列出了可以添加到该工程的各种管理数据库对象的类型,如图8所示,包括stored procedures 、User-Defined Functions等.我们来创建一个存储过程,用来简单的将那些处于discontinued状态的产品返回,将该存储过程文件命名为GetDiscontinuedProducts.cs.
图8:添加一个新的存储过程,名为GetDiscontinuedProducts.cs
这将创建一个新的C# class类文件,如下:
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void GetDiscontinuedProducts() { // Put your code here } }
我们注意到该存储过程作为一个static方法来执行,且位于一个名为StoredProcedures的部分类(partial class)文件之内. 此外,该 GetDiscontinuedProducts方法有一个SqlProcedure特性, 这就标明了该方法是一个存储过程.
下面的代码创建了一个SqlCommand对象,设其CommandText为一个SELECT查询,以返回Products table表里所有Discontinued列为1的记录.它然后执行该命令并将结果返回给客户端程序.添加这些代码到GetDiscontinuedProducts方法.
// Create the command SqlCommand myCommand = new SqlCommand(); myCommand.CommandText = @"SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM Products WHERE Discontinued = 1"; // Execute the command and send back the results SqlContext.Pipe.ExecuteAndSend(myCommand);
所有的管理数据库对象都可以使用SqlContext对象,该对象展示“调用者”(caller)的内容;而SqlContext又可以通过其Pipe属性来访问一个SqlPipe对象,该对象用来在SQL Server数据库和调用程序之间传递信息;而ExecuteAndSend方法,就像其名字暗示的那样,执行传入的SqlCommand对象,并将结果返回给客户端程序.
注意:管理数据库对象最适合做这种存储过程和用户定义函数——使用procedural logic逻辑而不是set-based logic逻辑.所谓Procedural logic逻辑包括处理一系列一行行(on a row-by-row basis)的数据或者处理标量数据(scalar data).然而,我们刚刚创建的GetDiscontinuedProducts方法,并未使用Procedural logic逻辑。其实该方法最理想的是作为一个T-SQL存储过程来执行.之所以作为一个管理存储过程来执行,是为了示范创建和配置管理存储过程所必要的步骤.
步骤4:配置Managed Stored Procedure
代码完成后我们准备将其配置给Northwind数据库.“Deploy”项执行的具体步骤我们将在第13步讲明白。进入解决资源管理器,在ManagedDatabaseConstructs工程名上右键单击,选“Deploy”项,然而,可能会出现如下的错误消息:“Incorrect syntax near 'EXTERNAL'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.”
该出错信息发生试图将编译文件注册到Northwind数据库时.为了将一个编译文件注册到一个SQL Server 2005数据库,该数据库的compatibility level必须设置为90.默认下,一个新的SQL Server 2005数据库的compatibility level为90.而Microsoft SQL Server 2000使用的数据库的默认compatibility level为80.由于使用的Northwind数据库最初是一个Microsoft SQL Server 2000数据库,其compatibility level被设置为80,因此需要设置为90以便于进行注册.要更新数据库的compatibility level,在Management Studio里打开一个New Query窗口,输入:exec sp_dbcmptlevel 'Northwind', 90点击工具栏上的执行图标以运行上述查询.
图9:更新Northwind数据库的Compatibility Level