加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之七十四:用Managed Code创建存储过程

发布时间:2016-11-22 07:06:45 所属栏目:MsSql教程 来源:网络整理
导读:第八步:从表现层调用Managed Stored Procedures 当对数据访问层和业务逻辑层进行扩充以支持调用GetDiscontinuedProducts 和 GetProductsWithPriceLessThan这2种managed stored procedures后,我们可以在一个ASP.NET页面里展示这些存储过程的结果了. 打开A

/uploads/allimg/c161121/14OI96003J30-5ZQ.png
图24:饮料类产品的ProductID, ProductName,CategoryID都列出来了

  注意:关于创建和使用UDF的更多详情,请参阅文章《Intro to User-Defined Functions》和《dvantages and Drawbacks of User-Defined Functions》

第十步:创建一个Managed UDF

  上面示例里创建的udf_ComputeInventoryValue和 udf_GetProductsByCategoryID用户函数都是T-SQL数据库对象.SQL Server 2005同样支持managed UDF,我们可以将其添加到ManagedDatabaseConstructs工程,就像在第三和第五步做的那样.在这一步,我们将用managed code执行udf_ComputeInventoryValue用户函数.

  在解决资源管理器里右键单击,选择“Add a New Item”,在对话框里选User-Defined Function模板,将新UDF文件命名为udf_ComputeInventoryValue_Managed.cs.

/uploads/allimg/c161121/14OI960055360-AO6.png
图25:向ManagedDatabaseConstructs工程添加一个Managed UDF

  该User-Defined Function模板将创建一个名为UserDefinedFunctions的partial class类,同时还有一个方法,该方法的名字与类文件的名字一样(就本例而言,为udf_ComputeInventoryValue_Managed)。该方法有一个SqlFunction特性, 这就标明了该方法是一个managed UDF.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
 [Microsoft.SqlServer.Server.SqlFunction]
 public static SqlString udf_ComputeInventoryValue_Managed()
 {
 // Put your code here
 return new SqlString("Hello");
 }
}

  该udf_ComputeInventoryValue方法目前返回一个SqlString对象,且不接受任何的输入参数.我们将对其进行更新以包含3个参数——UnitPrice, UnitsInStock,和Discontinued,并返回一个SqlMoney对象.该方法用到逻辑与上面的T-SQL类型的udf_ComputeInventoryValue用户函数的一样.

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlMoney udf_ComputeInventoryValue_Managed
 (SqlMoney UnitPrice, SqlInt16 UnitsInStock, SqlBoolean Discontinued)
{
 SqlMoney inventoryValue = 0;

 if (!UnitPrice.IsNull && !UnitsInStock.IsNull)
 {
 inventoryValue = UnitPrice * UnitsInStock;

 if (Discontinued == true)
  inventoryValue = inventoryValue * new SqlMoney(0.5);
 }

 return inventoryValue;
}

  我们注意到UDF方法的输入参数就是其对应的SQL类型:UnitPrice的类型为SqlMoney、UnitsInStock的类型为SqlInt16、Discontinued的类型为SqlBoolean.这些类型反映了这些列在Products表里定义的类型:UnitPrice列的类型为money、UnitsInStock列的类型为smallint、Discontinued列的类型为bit.

  代码首先创建了一个SqlMoney类型的名为inventoryValue的实例,并赋值为0.由于Products表允许UnitsInPrice 和 UnitsInStock列的值为NULL,因此我们首先通过SqlMoney对象的IsNull属性来检查这2列是否包NULL值。如果这2列的值都不为NULL,那么UnitPrice乘以UnitsInStock就得到了inventoryValue的值,另外如果Discontinued为true的话,inventoryValue的值减半.

  注意:由于SqlMoney对象只允许2个SqlMoney实例相乘,它不允许一个SqlMoney实例与一浮点数(literal floating-point)相乘,所以在代码里我们用一个值为0.5的SqlMoney实例与inventoryValue相乘.

第11步骤:配置Managed UDF

  现在我们已经创建了一个managed UDF,我们将把它配置给Northwind数据库.就像我们在第四步看到的那样,在解决资源管理器里,在工程名上右键单击选“Deploy”.

完成后,返回到SQL Server Management Studio,刷新Scalar-valued Functions文件夹.你就会看到2个实体:

.dbo.udf_ComputeInventoryValue——在第九步创建的T-SQL UDF

.dbo.udf ComputeInventoryValue_Managed——我们在第10步刚刚创建的managed UDF

对该managed UDF进行测试,在Management Studio里执行如下的查询:

SELECT ProductID, ProductName,
 dbo.udf_ComputeInventoryValue_Managed(
   UnitPrice,
   UnitsInStock,
   Discontinued
  ) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC

该命令使用的是udf ComputeInventoryValue_Managed函数而不是udf_ComputeInventoryValue函数,但是输出结果都一样,可以查看图23的截屏.

第12步:调试Managed Database Objects

  在第72章我们探讨了通过Visual Studio调试SQL Server的3种模式:直接数据库调试、应用程序调试、通过SQL Server Project调试.Managed database objects不能用直接数据库模式调试,不过可以从一个客户端程序和SQL Server Project来调试.为了使调试正常工作,SQL Server 2005 数据库要求必须允许SQL/CLR调试.记得当我们最初创建ManagedDatabaseConstructs工程时,Visual Studio询问我们是否激活SQL/CLR调试(见第2步的图6).我们可以在Server Explorer窗口里在数据库上右键单击,以对该配置进行修改.

/uploads/allimg/c161121/14OI9600I0-MX5.png
图26:确保数据库激活SQL/CLR调试

  设想我们想调试GetProductsWithPriceLessThan存储过程.我们首先要在GetProductsWithPriceLessThan方法的代码里设置断点.

/uploads/allimg/c161121/14OI9600X440-Y917.png
图27:在GetProductsWithPriceLessThan方法里设置断点

  首先我们考察从SQL Server Project里调试managed database objects.

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读