更新后重新部署该SQL Server Project,这次应该不会出错了.返回SQL Server Management Studio,在Object Explorer里的Northwind 数据库上右键单击,选“刷新”.接下来,找到Programmability文件夹,再展开Assemblies文件夹。如图10所示,Northwind数据库现在包含了一个由ManagedDatabaseConstructs工程生成的编译文件.
图10:该ManagedDatabaseConstructs编译文件现在注册到Northwind数据库
也来打开Stored Procedures文件夹。你将会看到名为GetDiscontinuedProducts的存储过程。该存储过程是在部署的时候创建的,它指向ManagedDatabaseConstructs编译文件里的GetDiscontinuedProducts方法.当执行GetDiscontinuedProducts存储过程时,它反过来执行GetDiscontinuedProducts方法.由于它是一个管理存储过程(managed stored procedure),不能通过Management Studio来对其进行编辑(因此,在存储过程名旁边有一个锁的图标)
图11:GetDiscontinuedProducts存储过程展示在Stored Procedures文件夹
还有一个障碍要克服:该数据库被配置为阻止执行managed code.我们来做一个实验。打开一个new query窗口,执行GetDiscontinuedProducts存储过程.你将会收到如下的错误信息:“Execution of user code in the .NET Framework is disabled. Enable ‘clr enabled'configuration option.”
让我们检查Northwind数据库的配置信息,在查询窗口键入并运行命令“exec sp_configure”。其显示“clr enabled”目前设置为0.
图12:“clr enabled”目前设置为0.
我们注意到每条配置(如图12)都有4个值:“minimum”、“maximum”、“config”、“run” 值.要更新“clr enabled”配置的“config”值,执行如下的命令:exec sp_configure 'clr enabled', 1
如果你再运行“exec sp_configure”的话,你将看到上述声明将“clr enabled”配置的“config”值设为1,而“run”值仍然为0.因此,我们需要执行RECONFIGURE命令,它将会把“ run”值设为目前的“config”值.在查询窗口输入“RECONFIGURE”,再点工具栏上的执行图标.如果你运行“exec sp_configure”的话,现在你可以看到“clr enabled”配置的“config” 和 “run”值都为1.
完成“clr enabled”配置后,我们准备运行GetDiscontinuedProducts存储过程.在查询窗口键入并运行命令“exec GetDiscontinuedProducts”.调用该存储过程将导致执行GetDiscontinuedProducts方法里相应的managed code.代码发出一个SELECT查询并返回所有处于discontinued状况的产品,并将数据返回给调用程序——具体到本例,就是SQL Server Management Studio.Management Studio将接收到的数据展示在Results窗口.
图13:GetDiscontinuedProducts存储过程返回所有处于Discontinued状态的产品
第五步:创建接收输入参数的Managed Stored Procedures
我们在本教程创建的很多查询和存储过程都使用参数.比如,在第67章,我们创建了一个名为GetProductsByCategoryID的存储过程,它接收一个名为@CategoryID的输入参数.该存储过程返回那些其CategoryID值与@CategoryID吻合的产品.
要创建接收输入参数的managed stored procedure,仅仅在定义方法时指定这些参数即可.我们来做个演示,在ManagedDatabaseConstructs工程里添加一个名为GetProductsWithPriceLessThan的另一个managed stored procedure.该managed stored procedure接收一个指定了价格的参数,返回所有的其UnitPrice列低于参数值的产品.
我们来进行添加.在ManagedDatabaseConstructs工程名上右键单击,选“添加新存储过程”.将文件命名为GetProductsWithPriceLessThan.cs.就像我们在图3看到的那样,这将创建一个新的C# class类文件.
更新GetProductsWithPriceLessThan方法以使其接收一个名叫price的SqlMoney类型的输入参数.代码如下:
[Microsoft.SqlServer.Server.SqlProcedure] public static void GetProductsWithPriceLessThan(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 < @MaxPrice"; myCommand.Parameters.AddWithValue("@MaxPrice", price); // Execute the command and send back the results SqlContext.Pipe.ExecuteAndSend(myCommand); }