GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速

转载 2006年05月21日 21:42:00
Posted on 2006-04-17 18:43 笑看千秋_R
Table: MyUsers
  
@UserID (int,primary key,identity),
  
@UserName (nvarchar(50),not null),
  
@Description (nvarchar(50),not null),
  
@Status (bit,not null)

Procedure:
  
create procedure [dbo].[GetUsersByStatus]  --通过状态得到用户列表
    @RowIndex int,
    
@RecordCount int,
    
@Status bit
AS
BEGIN
    
SET NOCOUNT ON;

    
With VUsers as (
        
select *,row_number() over (order by UserID descas RowNum
        
from MyUsers where Status = @Status
)

    
select * from VUsers 
    
where RowNum > @RowIndex and RowNum <= (@RowIndex+@RecordCount)    
END

CREATE PROCEDURE [dbo].[GetUsersCountByStatus]  --取得通过状态得到用户列表的总数
    @Status bit
AS
BEGIN
    
SET NOCOUNT ON;
    
select count(UserID) from MyUsers where Status = @Status
END

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

1.在DataManager类中,增加一个属性
 
private bool _Status;
 
public bool Status
 
{
     
get{return  _Status;}
     
set{_Status = values;}
 }


2.增加一个方法

public DataSet GetUsers(int rowIndex,int recordCount)
{
    
/// <summary>
    
/// 取得用户列表
    
/// </summary>
    
/// <param name="rowIndex">行索引</param>
    
/// <param name="recordCount">页显示量(增量)</param>
    
/// <returns>用户列表数据集</returns>

    public DataSet GetUsers(int rowIndex, int recordCount)
    
{
        OpenConnection();
        
try
        
{
            cmd 
= new SqlCommand();
            cmd.Connection 
= con;
            cmd.CommandType 
= CommandType.StoredProcedure;
            cmd.CommandText 
= "GetUsersByStatus";
            
            SqlParameter spRowIndex 
= new SqlParameter("@RowIndex",SqlDbType.Int,4);
            spRowIndex.Direction 
= ParameterDirection.Input;        
            SqlParameter spRecordCount 
= new SqlParameter("@RecordCount",SqlDbType.Int,4);
            spRecordCount.Direction 
= ParameterDirection.Input;
        SqlParameter spStatus 
= new SqlParameter("@Status", SqlDbType.Bit, 1);
            spStatus.Direction 
= ParameterDirection.Input;

            cmd.Parameters.Add(spRowIndex);
            cmd.Parameters.Add(spRecordCount);
        cmd.Parameters.Add(spStatus); 
//在这里将增加的参数值隐式加入到查询

            spRowIndex.Value 
= rowIndex;
            spRecordCount.Value 
= recordCount;
        spStatus.Value 
= _Status;
        
            da 
= new SqlDataAdapter(cmd);
            DataSet ds 
= new DataSet();
        
            da.Fill(ds, 
"MyUsers");

            
return ds;
    }

        
catch (SqlException ex)
        
{
            
throw new Exception("无法取得有效数据", ex);
        }

        
finally
        
{
            CloseConnection();
        }

    }


    
/// <summary>
    
/// 根据用户状态取得用户总数
    
/// </summary>
    
/// <returns>用户总数</returns>

    public int GetUsersCount()
    
{
        OpenConnection();
        
try
        
{
            cmd 
= new SqlCommand();
            cmd.Connection 
= con;
            cmd.CommandType 
= CommandType.StoredProcedure;
            cmd.CommandText 
= "GetUsersCountByStatus";

            SqlParameter spStatus 
= new SqlParameter("@Status", SqlDbType.Bit, 1);
            spStatus.Direction 
= ParameterDirection.Input;

            cmd.Parameters.Add(spStatus);

            spStatus.Value 
= _Status;

            
int count = Convert.ToInt32(cmd.ExecuteScalar().ToString());
            
return count;
        }

        
catch (SqlException ex)
        
{
            
throw new Exception("无法取得有效数据", ex);
        }

        
finally
        
{
            CloseConnection();
        }

    }

}


3.在页面增加一个DropDownList,设置如下
<asp:DropDownList ID="ddShowUsersByStaus" runat="server" AutoPostBack="True">               
    
<asp:ListItem Selected="True" Value="all">全部</asp:ListItem>
                
<asp:ListItem Value="false">禁用</asp:ListItem>
                
<asp:ListItem Value="true">激活</asp:ListItem>
</asp:DropDownList></div>

4.在WebSite增加一个事件
 
protected ObjectDataSource_Created(object sender, ObjectDataSourceEventArgs e)
 
{
     
if(!ddShowUsersByStaus.SelectedValue.Equals("all"))
     
{
         DataManager  dm  
= (DataManager)e.GetInstance();
         dm.Status 
= ddShowUsersByStaus.SelectedValue;
     }

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


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

1.Datamanager中重载GetUsers()和GetUsersCount()两个方法.代码如下

public DataSet GetUsers(int rowIndex, int recordCount,bool status)
    
{
        OpenConnection();
        
try
        
{
            cmd 
= new SqlCommand();
            cmd.Connection 
= con;
            cmd.CommandType 
= CommandType.StoredProcedure;
            cmd.CommandText 
= "GetUsersByStatus";

            SqlParameter spRowIndex 
= new SqlParameter("@RowIndex", SqlDbType.Int, 4);
            spRowIndex.Direction 
= ParameterDirection.Input;
            SqlParameter spRecordCount 
= new SqlParameter("@RecordCount", SqlDbType.Int, 4);
            spRecordCount.Direction 
= ParameterDirection.Input;
            SqlParameter spStatus 
= new SqlParameter("@Status", SqlDbType.Bit, 1);
            spStatus.Direction 
= ParameterDirection.Input;

            cmd.Parameters.Add(spRowIndex);
            cmd.Parameters.Add(spRecordCount);
            cmd.Parameters.Add(spStatus);

            spRowIndex.Value 
= rowIndex;
            spRecordCount.Value 
= recordCount;
            spStatus.Value 
= status;            

            da 
= new SqlDataAdapter(cmd);
            DataSet ds 
= new DataSet();

            da.Fill(ds, 
"MyUsers");

            
return ds;            
        }

        
catch (SqlException ex)
        
{
            
throw new Exception("无法取得有效数据", ex);
        }

        
finally
        
{
            CloseConnection();
        }

    }


    
public int GetUsersCount(bool status)
    
{
        OpenConnection();
        
try
        
{
            cmd 
= new SqlCommand();
            cmd.Connection 
= con;
            cmd.CommandType 
= CommandType.StoredProcedure;
            cmd.CommandText 
= "GetUsersCountByStatus";

            SqlParameter spStatus 
= new SqlParameter("@Status", SqlDbType.Bit, 1);
            spStatus.Direction 
= ParameterDirection.Input;

            cmd.Parameters.Add(spStatus);

            spStatus.Value 
= status;

            
int count = Convert.ToInt32(cmd.ExecuteScalar().ToString());
            
return count;
        }

        
catch (SqlException ex)
        
{
            
throw new Exception("无法取得有效数据", ex);
        }

        
finally
        
{
            CloseConnection();
        }

    }


2.在页面增加DropDownList设置如下:
<asp:DropDownList ID="ddShowUsersByStaus" runat="server" AutoPostBack="True" 
OnSelectedIndexChanged
="ddShowUsersByStaus_SelectedIndexChanged">
    
<asp:ListItem Selected="True" Value="all">全部</asp:ListItem>
    
<asp:ListItem Value="false">禁用</asp:ListItem>
    
<asp:ListItem Value="true">激活</asp:ListItem>
</asp:DropDownList>

3.在DropDownList的SelectedIndexChanged事件增加代码:

protected void ddShowUsersByStaus_SelectedIndexChanged(object sender, EventArgs e)
{
    objMyUsers.SelectParameters.Clear();
    gvMyUsers.PageIndex 
= 0;
    
if ("all".Equals(ddShowUsersByStaus.SelectedValue))
    
{

    }


    
else
    
{
        Parameter pStatus 
= new Parameter("status", TypeCode.Boolean);
        
        objMyUsers.SelectParameters.Add(pStatus);
        pStatus.DefaultValue 
= ddShowUsersByStaus.SelectedValue;
    }
       
}

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

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

相关文章推荐

GridView/ListView + ObjectDataSource + Entity 实现Webform列表真分页

开发环境:Visual Studio 2010 如果说你还在用Visual Studio 2005,那么你应该知道没有ListView和Entity这两个东东。 如果说你还在用Visual Stu...

ObjectDataSource+DataPager+GridView+Nhibernate分页

如何使用GridView(需要实现IPageableItemContainer接口)加DataPager实现分页功能。 并使用ObjectDataSource控件来获得数据源实现分页。 1,Obj...
  • lhy2199
  • lhy2199
  • 2012年01月13日 13:01
  • 1224

ObjectDataSource和Gridview自定义分页

  • 2009年10月20日 17:15
  • 922KB
  • 下载

gridvew+objectDataSource n配置分页

很久以前学习过Asp.net1.1,现在才有机会学习Asp.net2.0,暂时发现GridView是个好东西,练习使用了一下它的自定义分页功能,由于不怎么熟悉,花了一点时间查资料和摸索才搞定,现在整理...
  • A_post
  • A_post
  • 2012年09月19日 11:38
  • 859

一步一步学习ObjectDataSource控件--自定义分页排序

在上篇http://mqingqing123.cnblogs.com/archive/2006/04/07/369020.html介绍了ObjectDataSource的常规使用。上次一个网友希望介绍...

使用ObjectDataSource为ListView高效分页一些注意事项

首先,写一个实现高效分页的存储过程: create procedure [dbo].[p_selectPagedStudents] @startRowIndex int, @maximumRow...
  • sdtsfhh
  • sdtsfhh
  • 2011年11月12日 11:37
  • 1447

利用SQL Server 2005的新特性来简单高效的实现分页

这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页。对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法。如果需要,这篇文章会补上这里...
  • hongluk
  • hongluk
  • 2012年06月12日 18:05
  • 615

ArcSDE10.2.1使用Oracle12c新特性——分页

在Oracle 12c推出之后,其中一个新特性就是分页语句。4 Easy Top-N and pagination queries ,更易用的Top-N和页码查询提供了类似MySQL中limit的语法...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
举报原因:
原因补充:

(最多只允许输入30个字)