存储过程一开始先确保@sortExpression参数的值已经被指定。如果未被指定则按照ProductID排序。接下来,开始构建动态的SQL查询。注意到,在这里的动态SQL查询和前面的用来从Products表获取所有行的查询有些不同。在前面的例子中,我们使用子查询获取每一个产品关联的分类和供应商名。在GetProductsPagedAndSorted中我们只能使用JOINS因为结果需要根据分类或者供应商名来排序。
我们通过连接静态的查询语句和@sortExpression, @startRowIndex, @maximumRows参数来组成动态查询。因为@startRowIndex和@maximumRows是整数参数,所以必须在连接前把它们转化为nvarchar类型。在动态SQL查询连接完毕后就可以使用sp_executesql来执行。
先来花一些时间使用各种@sortExpression、@startRowIndex和@maximumRows参数的值来测试存储过程。在服务器资源管理器中右键点击存储过程然后选择执行。IDE会启动运行存储过程对话框,我们输入各种输入参数(见图1)。比如,要让结果按照分类名排序,就把@sortExpression参数的值设置为CategoryName;如果要按照公司名排序就用CompanyName。所有参数的值都正确设置后点击OK。结果就会在输出窗口中显示。图2显示了按照UnitPrice倒序,从11到20的记录。
图1:试着设置存储过程的三个输入参数
图2:存储过程的结果显示在了输入窗口中
Step 2: 添加数据访问和业务逻辑层
既然我们已经建立了GetProductsPagedAndSorted存储过程,下一步就是要通过我们的应用程序构架来执行它。我们需要为DAL和BLL添加一个正确的方法。首先让我们为DAL添加一个方法。打开Northwind.xsd强类型DataSet,右键点击ProductsTableAdapter,从菜单中选择添加查询选项。和前面教程中做的一样,我们需要配置一个新的DAL方法来使用建立的存储过程-GetProductsPagedAndSorted。选择使用已有存储过程选项。
图3:选择一个已有的存储过程
在下一步中,我们通过从下拉列表中选择GetProductsPagedAndSorted存储过程来使用它。
图4:使用GetProductsPagedAndSorted存储过程
在下一屏幕中,我们选择它返回表格信息。
图5:指示存储过程返回表格信息
最后,我们创建DAL方法来填充DataTable和返回DataTable,分别命名为FillPagedAndSorted和GetProductsPagedAndSorted。
图6:选择方法名
现在,我们已经扩展了DAL,让我们来看看BLL吧。打开ProductsBLL类文件并且新增一个方法GetProductsPagedAndSorted。这个方法接受三个参数-sortExpression,startRowIndex和maximumRows。仅仅是简单地调用DAL的GetProductsPagedAndSorted方法,代码如下:
[System.ComponentModel.DataObjectMethodAttribute( System.ComponentModel.DataObjectMethodType.Select, false)] public Northwind.ProductsDataTable GetProductsPagedAndSorted( string sortExpression, int startRowIndex, int maximumRows) { return Adapter.GetProductsPagedAndSorted (sortExpression, startRowIndex, maximumRows); }
Step 3: 配置ObjectDataSource来传入SortExpression参数
好了,我们已经为DAL和BLL添加了方法来调用GetProductsPagedAndSorted存储过程。剩下的工作就是配置SortParameter.aspx页面的ObjectDataSource来根据用户请求的排序为新的BLL方法传入SortExpression参数。
首先,我们把ObjectDataSource的SelectMethod从GetProductsPaged修改为GetProductsPagedAndSorted。可以通过配置数据源向导的属性窗口来修改或者直接在声明代码中修改。下一步,我们需要提供ObjectDataSource的SortParameterName 属性。属性设置后,ObjectDataSource才会把GridView的SortExpression属性传入SelectMethod。特别地,ObjectDataSource会根据SortParameterName的值来寻找输入仓储,既然BLL中GetProductsPagedAndSorted方法的输入参数叫做sortExpression,我们这里的ObjectDataSource的SortExpression属性也应该设置为“sortExpression”。
在这两步修改后,ObjectDataSource的声明应该如下: