书接上回,我们提到,如果我们分页的数据,在查询的存储过程中需要更多参数,在使用ObjectDataSource作为数据源完成界面级分页,我们必须做一些其他的事情.为了让示例更为易懂,我们将上一次的MyUsers表变化一下,增加一个用户状态列.并增加两个存储过程.

GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速Table: MyUsers
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速  
@UserID (int,primary key,identity),
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速  
@UserName (nvarchar(50),not null),
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速  
@Description (nvarchar(50),not null),
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速  
@Status (bit,not null)
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
Procedure:
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速  
create procedure [dbo].[GetUsersByStatus]  --通过状态得到用户列表
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
    @RowIndex int,
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
@RecordCount int,
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
@Status bit
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
AS
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
BEGIN
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
SET NOCOUNT ON;
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
With VUsers as (
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速        
select *,row_number() over (order by UserID descas RowNum
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速        
from MyUsers where Status = @Status
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速)
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
select * from VUsers 
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
where RowNum > @RowIndex and RowNum <= (@RowIndex+@RecordCount)    
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
END
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
CREATE PROCEDURE [dbo].[GetUsersCountByStatus]  --取得通过状态得到用户列表的总数
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
    @Status bit
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
AS
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
BEGIN
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
SET NOCOUNT ON;
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速    
select count(UserID) from MyUsers where Status = @Status
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
END

        在WebSite的DataManager中,再增加两个带参数的分页查询的方法.下面介绍两种带参的分页查询方法的写法(原因是和ObjectDataSource的运行机制有关):
(1)
MSDN中提到,ObjectDataSource有这样一个事件:ObjectDataSources_Created,它将在每次ObjectDataSource
初始化TypeName指定的类时触发.也就是说,如果分页的方法需要除RowIndex,RecordCount外的其他参数的话可以
借助此事件来增加参数.由此,可以按下面方式增加分页方法:

GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速1.在DataManager类中,增加一个属性
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速 
private bool _Status;
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速 
public bool Status
 }
        这样,在选择了用户状态之后,ObjectDataSource会首先将选择的值赋给Status属性,然后才会去调用GetUsers()方法取得用户列表 至此,我们可以在不必改变原有方法接口的前提下,解决增加了参数的问题.
 然而,这样似乎还是很麻烦,无谓在DataManager类中增加属性,使得Web和DataManager成为紧耦合应用,同时也非"懒人"所为.再介绍 一种更为灵活的方式供大家参考


(2)
ObjectDataSource类的SelectParameters是可以动态改变的,据此,我们按下面的顺序来更改应用.

GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速1.Datamanager中重载GetUsers()和GetUsersCount()两个方法.代码如下
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
public DataSet GetUsers(int rowIndex, int recordCount,bool status)
}

        如何?这样看上去只是给ObjectDataSource的参数集合动态增加了一个参数,它自己就会去调用重载后的分页方法,省得我们在专门指定SelectMethod.编码简洁多了,维护起来也更容易,增加分页的条件无非是增加重载的方法和变更动态增加参数的代码,无意间发现这就是"开-闭"原则的小应用.(估计没人在乎这个吧...)

        采用GridView作为数据绑定控件,好处在于ObjectDataSource会根据GridView的变化自动向数据库取出当前需要的数据,而不用我们为它担忧一丝一毫.至少不用为取得空数据和页码不正确睡不着觉了.数据操作应该是完整的增删查改.我们把查询做得很彻底了,后面将介绍增加,删除,修改记录的操作,我想,GridView&ObjectDataSource
不会让大家失望的.未完待续.......(To Be Continue!!)

 

相关文章: