第八步:从表现层调用Managed Stored Procedures
当对数据访问层和业务逻辑层进行扩充以支持调用GetDiscontinuedProducts 和 GetProductsWithPriceLessThan这2种managed stored procedures后,我们可以在一个ASP.NET页面里展示这些存储过程的结果了.
打开AdvancedDAL文件夹里的ManagedFunctionsAndSprocs.aspx页面,从工具箱拖一个GridView控件到设计器,设其ID为DiscontinuedProducts,在其智能标签里绑定到一个名为DiscontinuedProductsDataSource的ObjectDataSource控件,设置其调用ProductsBLLWithSprocs class类的GetDiscontinuedProducts方法.
图20:调用ProductsBLLWithSprocs Class类
图21:在SELECT标签里调用GetDiscontinuedProducts方法
由于我们只需要展示产品信息,在UPDATE, INSERT,和DELETE标签里选 “(None)”,再点Finish完成配置.完成后Visual Studio会为ProductsDataTable表的列自动的添加BoundField列 或 CheckBoxField列. 将除ProductName和Discontinued以外的列全部删除.这样你的GridView 和 ObjectDataSource的声明代码看起来和下面的差不多:
<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="DiscontinuedProductsDataSource"> <Columns> <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" /> </Columns> </asp:GridView> <asp:ObjectDataSource runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetDiscontinuedProducts" TypeName="ProductsBLLWithSprocs"> </asp:ObjectDataSource>
花点时间在浏览器里登录该页面。当登录时,ObjectDataSource控件将调用ProductsBLLWithSprocs class类的 GetDiscontinuedProducts方法.就像我们在第七步看到的那样,该方法又调用DAL层的ProductsDataTable class类的GetDiscontinuedProducts方法,该方法又调用存储过程GetDiscontinuedProducts.该存储过程返回那些处于“discontinued”状态的产品. 存储过程返回的结果填充到DAL层的一个ProductsDataTable,进而返回给BLL,再返回给表现层并绑定到一个GridView控件展现出来.
图22:“Discontinued”的产品被列出来了
我们可以继续加强练习,比如在页面上再放置一个TextBox控件和一个GridView控件。在TextBox控件里输入一个数,而GridView控件调用ProductsBLLWithSprocs class类的GetProductsWithPriceLessThan方法将价格低于该数的产品展示出来.
第九步:创建并调用T-SQL UDFs
用户自定义函数——简称UDF,是一种数据库对象,与编程语言里的函数定义很相仿.与C#里面的函数类似,UDF可以包含一系列的输入参数并返回一个特定类型的值.一个UDF要么返回标量数据(scalar data)——比如一个string, 一个integer等等;要么返回一个表列数据(tabular data).让我们先快速的考察一下这2种类型的UDF,先从标量数据类型开始.
下面的UDF用于计算某个特定产品的总价.其有3个输入参数——UnitPrice, UnitsInStock,Discontinued.其返回一个money类型的值.它通过以UnitPrice乘以UnitsInStock来得到总价,如是处于“discontinued”状态,则总价减半.
CREATE FUNCTION udf_ComputeInventoryValue ( @UnitPrice money, @UnitsInStock smallint, @Discontinued bit ) RETURNS money AS BEGIN DECLARE @Value decimal SET @Value = ISNULL(@UnitPrice, 0) * ISNULL(@UnitsInStock, 0) IF @Discontinued = 1 SET @Value = @Value * 0.5 RETURN @Value END
将该UDF添加到数据库后,我们打开Management Studio,打开Programmability文件夹,再打开Functions文件夹,再打开Scalar-value Functions文件夹,就可以看到该UDF.我们可以在一个SELECT查询里这样来使用:
SELECT ProductID, ProductName, dbo.udf_ComputeInventoryValue (UnitPrice, UnitsInStock, Discontinued) as InventoryValue FROM Products ORDER BY InventoryValue DESC
我已经将该udf_ComputeInventoryValue用户函数添加到了Northwind数据库。图23就是在Management Studio里调用上述SELECT查询得到的输出结果.
图23:列出了每个产品的总价
UDF也可以返回表列数据.比如,我们可以创建一个UDF返回属于某个category的所有产品: