分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库

简介:     这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据、显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加、修改、删除数据后如何更新,如何查询数据等等。

 

    这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据、显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加、修改、删除数据后如何更新,如何查询数据等等。一整套完整的解决方案。

 

    这个方案要有几个特点

      1、支持多种数据库,可以提供多个分页算法以便于支持多种数据库。

      2、可以在不同的要求下选用最优的分页算法。比如如果只需要按照主键排序,那么选择Max分页算法无疑是最快的一种分页算法。

      3、按需所取。不管是哪一种分页算法,都要达到按需所取。假设一页显示20条记录,那么从数据库里面最多只提取20条记录,不可以多取一条。

      4、使用简单。无论是更换分页算法,更换数据库,还是处理分页的事件,都是很简单的几行代码即可搞定。

      5、很方便的实现数据查询的功能。查询后显示数据,查询后修改、删除数据,修改、删除后重新显示数据等。

      6、每一个部分都可以替换。

      7、支持海量数据。无论数据多还是少,都要适合,而且要尽量快。

 

    分页解决方案的组成部分

      显示数据的控件、分页控件、分页算法、数据访问函数库、数据库 

      如:GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + SQL Server2000

      1、显示数据的控件可以是GridViewDetailsViewFormViewRepeaterDataGridDataListCheckBoxListRadioButtonList等。(控件的继承关系可以看这里http://www.cnblogs.com/jyk/archive/2009/04/29/1446033.html 这是.net 里面带的几个常用控件的继承树)。也可以支持直接返回DataTable等记录集。

      2、分页控件,可以是QuickPager也可以是吴旗娃的分页控件,也可以是EasyTools等其他的分页控件。

      3、分页算法目前还没有发现同类的,硬要算的话,储存过程有一点点类似。

      QuickPager_SQL  原来是QuickPager里面的一部分,现在独立出来,可以单独使用了。

      4、数据访问函数库可以换成SQLHelp、微软的企业库等,当然需要其他的实现一个接口(IDALforPager)。

      5、数据库可以是AccessExcelSQL Server,理论上也支持OrcaleMySQL等,只是没有安装这些数据库,所以还没有具体实现。

 

      (至于ORM嘛,不是太了解,不知道能不能和哪个部分替换。)

 

      各个部分之间的关系

      1QuickPagerQuickPager_SQL

      这个就像SqlCommandSqlConnection的关系一样。      

SqlConnection cn  =   new  SqlConnection();
SqlCommand cm 
=   new  SqlCommand();
cm.Connection 
=  cn;
cm.Connection.Open();

 

      同样,QuickPager 里面一个一个成员的类型就是PagerSQL(也就是QuickPager_SQL)。

      

      2QuickPagerDataAccessLibrary

      他们是通过一个接口(IDALforPager)联系在一起的,

      

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
public interface IDALforPager
    {
        
/// <summary>
        
/// 传入SQL语句,返回DataTable的接口
        
/// </summary>
        
/// <param name="sql">SQL语句</param>
        
/// <returns></returns>
        DataTable ExecuteFillDataTable(string sql);

        
/// <summary>
        
/// 传入SQL语句,返回第一条记录,第一个字段的值的接口
        
/// </summary>
        
/// <param name="sql"></param>
        
/// <returns></returns>
        string ExecuteString(string sql);

        
/// <summary>
        
/// 记录出错的描述信息
        
/// </summary>
        string ErrorMessage { get; }
       
    }

 

      3QuickPager与显示数据的控件

      为了便于使用,就是说想在使用的时候尽量的少写代码,所以我是把显示数据的控件传递到了分页控件里面,然后在需要绑定控件的时候,采用as的方式来判断是哪种控件,然后在强制转换,最后实现绑定控件的目的。研究了一下.net里的一些控件的继承关系,发现虽然控件很多,但是我只需要做三次判断就可以了,这就是基类的好处吧。

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
private void DataBind(System.Web.UI.Control control, MarshalByValueComponent dt)
        {
            
if (control == null)
                
return;

            
//为什么没有一个统一的DataSource呢?
            BaseDataBoundControl tmpBaseDataBoundControl = control as BaseDataBoundControl;
            
if (tmpBaseDataBoundControl != null)
            {
                tmpBaseDataBoundControl.DataSource 
= dt;
                tmpBaseDataBoundControl.DataBind();
            }
            
else 
            {
                Repeater tmpRepeater 
= control as Repeater;
                
if (tmpRepeater != null)
                {
                    tmpRepeater.DataSource 
= dt;
                    tmpRepeater.DataBind();
                }
                
else 
                {
                    BaseDataList tmpBaseDataList 
= control as BaseDataList;
                    
if (tmpBaseDataList != null)
                    {
                        tmpBaseDataList.DataSource 
= dt;
                        tmpBaseDataList.DataBind();
                    }
                    
else
                    {
                        
//不在判断范围内,退出
                        return;
                    }
                }
            }

        }

 

      4QuickPager_SQLDataAccessLibrary、显示数据的控件没有任何关系。

 

      5QuickPagerQuickPager_UI

      QuickPager_UI 也是分页控件的一个成员,因为至少有三种分页方式(PostBackURLXMLHttp),所以呢我采用了基类和子类的方式来实现这种需求,以达到可以随时扩展的需求。

  

    分页解决方案从使用方法的角度来说,有两种方式

        第一种就是“自动运行”,设置属性,其他的就不用管了(仅限于QuickPager,其他的分页控件可能不支持);

        另一种是“手动运行”,手动运行就要多做一些事情了(其他分页控件的情况)。

 

    分页解决方案从提交数据的角度,有三种方式。

          PostBackURLXMLHttp。当然这三种也是针对于QuickPager来说的,其他的分页控件是否支持,就看作者的了。

 

    使用方法:

      时间比较紧,所以这里先说一下使用方法是自动运行、PostBack的情况。

            1、一般显示数据

protected   override   void  OnInit(EventArgs e)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
{
            
base.OnInitComplete(e);
            
//数据访问函数库
            DataAccessLibrary dal = DALFactory.CreateDAL();
            Pager1.DAL 
= dal;
            
            
//定义QuickPager_SQL
            PagerSQL pagerSQL = PagerSQL.Create(PagerSQLKind.MaxMin);
            pagerSQL.Page 
= this;
            Pager1.ManagerPageSQL 
= pagerSQL;

            Pager1.ShowDataControl 
= this.GV;       //设置显示数据的控件
            
        }

        
protected   void  Page_Load( object  sender, EventArgs e)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
{
            
            
if (!Page.IsPostBack)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                SetPagerInfo();         
//设置表名、字段名等
            }

        }


img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gif        
给QuickPager_SQL 设置属性,以便拼接SQL #region 给QuickPager_SQL 设置属性,以便拼接SQL
        
private void SetPagerInfo()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            Pager1.ManagerPageSQL.TableName 
= "News_NewsInfo";          //表名或者视图名称
            Pager1.ManagerPageSQL.TableShowColumns = "*";               //需要显示的字段
            Pager1.ManagerPageSQL.TableIDColumn = "NewsID";             //主键名称,不支持复合主键
            Pager1.ManagerPageSQL.TableOrderByColumns = "NewsID"//排序字段,根据分页算法而定,可以支持多个排序字段
            Pager1.ManagerPageSQL.TableQuery = "";                      //查询条件

            Pager1.PageSize 
= 4;                                        //一页显示的记录数

        }

        
#endregion

            2、查询数据

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif   处理查询数据的情况 #region 处理查询数据的情况
        
protected void Btn_Search_Click(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//获取查询条件
            string query = "";
            
string tmp = "";

            tmp 
= this.Txt_Title.TextTrimNone;
            
if (tmp.Length > 0)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
if (query.Length == 0)
                    query 
= " title like '%" + tmp + "%'";
                
else
                    query 
+= " and title like '%" + tmp + "%'";
                
            }


            
//还可以添加其他的查询条件,这里省略

            
//给QuickPager_SQL 设置查询条件
            this.Pager1.ManagerPageSQL.TableQuery = query;  //设置查询条件
            this.Pager1.BindFirstPage();                    //重新绑定控件,显示第一页的数据

        }

        
#endregion

            3、添加、修改、删除后重新显示数据

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif   添加后重新显示数据 #region 添加后重新显示数据
        
protected void Btn_Add_Click(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//添加新的数据后,显示第一页的数据
            this.Pager1.BindFirstPage();
        }

        
#endregion


img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gif        
修改数据后重新显示当前页的数据 #region 修改数据后重新显示当前页的数据
        
protected void Btn_Mod_Click(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//比如在第三页修改了一条数据,修改完毕后,重新显示第三页的数据。
            this.Pager1.BindThisPage();
        }

        
#endregion


img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gif        
添加后重新显示数据 #region 添加后重新显示数据
        
protected void Btn_Del_Click(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//比如在第三页删除了一条数据后,重新显示第三页的数据。
            
//和修改数据后重新显示的区别在于,删除数据后需要重新统计总记录数,和总页数
            this.Pager1.BindThisPageForDelete();
        }

        
#endregion

 

 

      

 

      关于三层

      现在三层还是很流行的,那么我的这个算不算是三层呢?其实算不算对于我来说是无所谓的事情,又没有谁规定,现在写项目必须三层(或者MVC),否则就是不合格产品。既然没有这个规定,那么我又为何要在乎是否可以靠到三层结构上呢?

 

      另外呀,我觉得这么写代码挺简单的,要说简化,还确实是有简化的空间,但是说要往三层结构上面靠拢,我还确实不知道应该怎么做。

      就像http://www.cnblogs.com/wisdomqq/archive/2009/04/29/1446579.html 里说的,“经常看到有的朋友使用三层结构或者MVC模式,比较生硬,强行进行拆分代码,使得业务代码分散在各个角落,反而更难阅读和维护了。”

       我觉得这么写,对于简单的应用是没有什么问题的,当然了复杂的情况是有其他的方法来解决的。

 

代码下载:

http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html

 

ps:今天先写这么多,以后再详细说明。

 

相关文章
|
14天前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
79 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
20小时前
|
SQL 存储 移动开发
HTML5 Web SQL 数据库详解
Web SQL 数据库是 HTML5 中的一种本地存储技术,允许在浏览器中使用 SQL 语言操作本地数据,支持离线访问和事务处理,适用于缓存数据和小型应用。然而,其存储容量有限且仅部分现代浏览器支持,标准已不再积极维护,未来可能被 IndexedDB 和 localStorage 等技术取代。使用时需谨慎考虑兼容性和发展前景。
|
23天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
40 11
|
18天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
29 2
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
|
2月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
58 0
|
2月前
|
SQL 数据处理 数据库
|
2月前
|
SQL 存储 调度
|
2月前
|
SQL 安全 数据库
|
2月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
66 0
下一篇
无影云桌面