自己编写的操作实体类的分页控件, 实现页码层与数据库的具体的信息隔离
目前网络上有很多成熟的分页控件, 不过很多都是基于Sql语句进行分页, 而且直接绑定到分页控件中, 不能通过实体集合进行绑定, 因此不是很适合我目前项目的架构开发, 偶然一次机会在博客上看到有"永不言拜"先生发表的
Sqlserver存储过程和C#分页类简化你的代码!
一文, 深受启发, 结合我正在使用的架构写了一个分页控件。
分页控件在Web开发中是不可或缺的一个控件, 但目前很多分页控件, 是通过设置Sql语句的方式进行分页, 这种方式的分页控件的缺点是和数据库紧密联系一起, 需要定制输出内容的时候, 需要绑定数据库字段的名称, 而且需要在底层拼接Sql语句以供分页控件调用. 在分层比较明显的架构中, 这种从界面层直接到数据库底层的操作破坏了分层的优雅和特点.
如果能够利用分页控件的专有特点(易用/分页检索)和分层架构的特点(共享实体类, 隔离底层和细节), 使得分页控件布局的时候访问的是实体类的信息, 而有可以按页进行数据检索, 那么就可以完美解决这个问题.
我在业余时间一直希望能够解决这个问题, 通过不断的摸索以及对分页控件的分析研究, 终于较好的解决了目前架构中采用的分页控件所存在的一些不足, 希望能够在将来的项目中使用.
该分页控件在数据库层是通过一个存储过程进行分页的计算处理, 在数据访问层通过代码调用存储过程进行获取记录数或记录数据, 每个层通过一个分页控件的实体类进行数据传递, 实现分页控件所需信息的传递.
控件的效果如下所示:代码请在在连接
http://www.wuhuacong.com.cn/UpLoadFile/PagerDemo.zip
下载

控件的效果如下所示:代码请在在连接
http://www.wuhuacong.com.cn/UpLoadFile/PagerDemo.zip
下载

附件
中包括了通过分页的存储过程脚本, 控件代码, 控件传递实体, 业务逻辑代码, 页面测试代码.

///
<summary>

///
根据条件查询数据库,并返回对象集合(用于分页数据显示)

///
</summary>

///
<param name="condition">
查询的条件
</param>

///
<param name="info">
分页实体
</param>

///
<returns>
指定对象的集合
</returns>

protected
virtual
ArrayList BaseFind(
string
condition, PagerInfo info)

{

ArrayList list
=
new
ArrayList();


PagerHelper helper
=
new
PagerHelper(tableName, condition, ConnectionString);

info.RecordCount
=
helper.GetCount();


PagerHelper helper2
=
new
PagerHelper(tableName,
false
,
"
*
"
, primaryKey,

info.PageSize, info.CurrenetPageIndex,
false
, condition, ConnectionString);


using
(IDataReader dr
=
helper2.GetDataReader())

{

while
(dr.Read())

{

list.Add(
this
.DataReaderToEntity(dr));

}

}

return
list;

}
中包括了通过分页的存储过程脚本, 控件代码, 控件传递实体, 业务逻辑代码, 页面测试代码.

///
<summary>

///
根据条件查询数据库,并返回对象集合(用于分页数据显示)

///
</summary>

///
<param name="condition">
查询的条件
</param>

///
<param name="info">
分页实体
</param>

///
<returns>
指定对象的集合
</returns>

protected
virtual
ArrayList BaseFind(
string
condition, PagerInfo info)

{

ArrayList list
=
new
ArrayList();


PagerHelper helper
=
new
PagerHelper(tableName, condition, ConnectionString);

info.RecordCount
=
helper.GetCount();


PagerHelper helper2
=
new
PagerHelper(tableName,
false
,
"
*
"
, primaryKey,

info.PageSize, info.CurrenetPageIndex,
false
, condition, ConnectionString);


using
(IDataReader dr
=
helper2.GetDataReader())

{

while
(dr.Read())

{

list.Add(
this
.DataReaderToEntity(dr));

}

}

return
list;

}

///
<summary>

///
根据条件查询数据库,并返回对象集合(用于分页数据显示)

///
</summary>

///
<param name="condition">
查询的条件
</param>

///
<param name="info">
分页实体
</param>

///
<returns>
指定对象的集合
</returns>

public
ProductsCollection Find(
string
condition, PagerInfo info)

{

ProductsCollection products
=
new
ProductsCollection();

products.AddRange(
base
.BaseFind(condition, info));

return
products;

}



//
页面后台调用代码如下:

private
void
SearchData()

{

PagerInfo info
=
Pager1.PagerInfo;

Pager1.DataSource
=
product.FindByProductName(
this
.txtProductName.Text, info);

Pager1.PagerInfo
=
info;

Pager1.DataBind();

}


public
void
PageIndexChanged(
object
sender, Pager.PageIndexChangedEventArgs e)

{

SearchData();

}

private
void
btnSearch_Click(
object
sender, System.EventArgs e)

{

Pager1.CurrentPageIndex
=
1
;

SearchData();

}
希望对大家有帮助!!