为便于演示,我们将创建一个新的managed stored procedure,返回那些UnitPrice值高于指定值的产品.在你的电脑上创建一个名为GetProductsWithPriceGreaterThan.cs 的新文件,并键入如下的代码(你可以使用Visual Studio, Notepad或任何的文本编辑器来进行):
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 GetProductsWithPriceGreaterThan(SqlMoney price) { // Create the command SqlCommand myCommand = new SqlCommand(); myCommand.CommandText = @"SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM Products WHERE UnitPrice > @MinPrice"; myCommand.Parameters.AddWithValue("@MinPrice", price); // Execute the command and send back the results SqlContext.Pipe.ExecuteAndSend(myCommand); } }
这些代码与我们在第五步创建的GetProductsWithPriceLessThan方法的代码很相似.唯一的不同在于:方法名不同、WHERE字句不同、以及查询使用的参数名不同.返回到GetProductsWithPriceLessThan方法,其WHERE字句为“WHERE UnitPrice < @MaxPrice”. 而在这里,GetProductsWithPriceGreaterThan方法里,代码为“WHERE UnitPrice > @MinPrice”.
我们现在需要将该类进行编译.在命令行里导航到你存放GetProductsWithPriceGreaterThan.cs文件的根目录,并使用C#编译器(csc.exe)来进行编译:
csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs
如果包含csc.exe的文件夹没有位于系统路径,那你将必须完全引用其路径,%WINDOWS%/Microsoft.NET/Framework/version/,比如:
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs
图29:对GetProductsWithPriceGreaterThan.cs文件进行编译
其中,/t标记指定将C# class类编译为一个DLL(而不是可执行文件)。而 /out标记指定了编译后文件的名称.
注意:除了用命令行来编译GetProductsWithPriceGreaterThan.cs class类外,我们还可以使用Visual C# Express Edition或在Visual Studio Standard Edition版里创建一个单独的Class Library project.S?ren Jacob Lauritsen为我们提供了一个Visual C# Express Edition project,它包含了GetProductsWithPriceGreaterThan存储过程,以及我们在第3、5和10步里创建的那2个managed stored procedures 和 UDF.此外还包含了添加相应数据库对象必需的T-SQL commands.
将代码编译完后,我们需要将其注册到SQL Server 2005数据库.可以通过T-SQL,使用命令CREATE ASSEMBLY,或通过SQL Server Management Studio. 我们来看使用Management Studio的情况.
在Management Studio里,展开Northwind数据库里的Programmability文件夹,其内有一个Assemblies文件夹。在该文件夹上右键单击,选“New Assembly”.这将开启New Assembly对话框(见图30),点击Browse按钮,选择我们刚刚编译的ManuallyCreatedDBObjects.dll文件,再点OK完成添加.在Object Explorer里你应该可以看到ManuallyCreatedDBObjects.dll文件.
图30:将ManuallyCreatedDBObjects.dll添加到数据库
图31:ManuallyCreatedDBObjects.dll展示在Object Explorer里
完成后,我们要将一个存储过程与编译文件里的GetProductsWithPriceGreaterThan方法联系起来.为此,打开一个new query窗口,执行下面的脚本:
CREATE PROCEDURE [dbo].[GetProductsWithPriceGreaterThan] ( @price [numeric](18, 0) ) WITH EXECUTE AS CALLER AS EXTERNAL NAME [ManuallyCreatedDBObjects].[StoredProcedures].[GetProductsWithPriceGreaterThan] GO
这将在Northwind数据库里创建一个名为etProductsWithPriceGreaterThan的新存储过程,并将其与GetProductsWithPriceGreaterThan方法联系起来(该方法属于编译文件ManuallyCreatedDBObjects)
执行完脚本后,在Object Explorer里刷新Stored Procedures文件夹。你将看到一个新的存储过程——GetProductsWithPriceGreaterThan,在该存储过程旁边有一个锁的图标.测试该存储过程,在查询窗口键入并执行如下的脚本:
exec GetProductsWithPriceGreaterThan 24.95
如图32所示,上述命令将那些价格高于24.95的产品展示出来.