Winform分页控件更新之集成Sqlite数据库分页

简介:
在Winform开发中,一直离不开分页处理,好的分页控件封装,能为开发节省很多时间和繁琐工作,对分页控件一直的改进和完善,也是我的兴趣之一。分页控件一直都有一些小的更新,不过基本上已能满足大多数的使用场景了。有一天,一个朋友告诉我:我们项目用的是Sqlite数据库做项目,这个分页控件能支持实现分页吗?由于分页控件虽然不直接访问数据,不过需要根据不同的数据库来构造不同的分页语句,因为之前听说过但没怎么研究过Sqlite数据库,当然也没有提供支持了。

既然朋友需要,那就得研究下,并提供相关的支持,经过一番小修改,即可完成内容的Sqlite分页支持了。在给出相关的分页实现例子之前,我们介绍一下,为什么项目使用Sqlite而不是使用Access数据库,他们之间有那些特点。 

1、Access特点

我们做小项目的时候特别是小的MIS系统一般也都要用数据库来保存数据,大部分的小系统都是用Access数据库,Access使用上确实非常方便,也方便对数据进行管理维护等优点,复制过去即可使用。但其实Access数据库本身也存在很多的问题:性能不行;数据不安全,用户可以直接用Access打开数据库文件进行数据修改,即使加密后都可以直接破解;Access的数据量一大,文件本身的体积就异常庞大;Access数据库文件很容易损坏等。 

2、 SQLite特点

SQLite是一个小型的C程序库,实现了独立的,可嵌入的,零配置的SQL数据库引擎,SQLite用的非常广泛,Web应用也都在用它,PHP5内置了SQLite的扩展,所以SQLite是桌面轻量级数据库的首选。
  • 事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。

  • 零配置——不需要安装和管理。

  • 实现了绝大多数SQL92标准。

  • 整个数据库存储在一个单一的文件中。

  • 数据库文件可以在不同字节序的机器之间自由地共享。

  • 支持最大可达2T的数据库。 (241 字节)

  • 字符串和BLOB类型的大小最大可达 2G 字节(231字节)。

  • 小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。

  • 在大多数常见操作上比流行的客户/服务器数据库引擎更快。

  • 简单,易于使用的API。

  • 内建TCL绑定。 另外提供可用于许多其他语言的绑定。

  • 具有良好注释的源代码,95%经过测试。

  • 独立:没有外部依赖。

  • 源代码位于公共域。 可用于任何用途。

 朋友介绍操作SQLite使用工具SQLiteSpy,实际上这个工具不支持数据库(如Access数据库)的导入,偶然发现还有SQLite Developer这样一个工具,管理上非常方便,操作图如下所示,使用发现功能比较丰富,支持对表字段定义的直接修改,编辑数据、Sql查询、创建、压缩、备份数据库等,对中文支持也不错。

 

 

 

言归正题,介绍完毕一些SQLite的使用后,继续介绍分页控件如何实现SQLite的分页处理吧。 

普通版本的分页控件呈现效果如下所示。

  

DevExpress样式版本的分页控件效果如下所示(均支持SQLite分页)

  

基于SqlLite数据库的分页控件使用例子代码如下:

         string connectionString =  "";

         public FrmCustomer()
        {
            InitializeComponent();

            connectionString =  string.Format( @" Data Source={0}\OrderWater.db;Version=3; ", Application.StartupPath);
        }

         private  void FrmCustomer_Load( object sender, EventArgs e)
        {
             this.winGridViewPager1.OnPageChanged +=  new EventHandler(winGridViewPager1_OnPageChanged);
             this.winGridViewPager1.OnStartExport +=  new EventHandler(winGridViewPager1_OnStartExport);
             this.winGridViewPager1.OnEditSelected +=  new EventHandler(winGridViewPager1_OnEditSelected);
             this.winGridViewPager1.OnDeleteSelected +=  new EventHandler(winGridViewPager1_OnDeleteSelected);
             this.winGridViewPager1.OnRefresh +=  new EventHandler(winGridViewPager1_OnRefresh);
             this.winGridViewPager1.OnAddNew +=  new EventHandler(winGridViewPager1_OnAddNew);
             this.winGridViewPager1.AppendedMenu =  this.contextMenuStrip1;
             this.winGridViewPager1.ShowLineNumber =  true; // 显示行号
             this.winGridViewPager1.PagerInfo.PageSize =  20; // 页面大小
             this.winGridViewPager1.EventRowBackColor = Color.LightCyan; // 间隔颜色

            BindData();
        }

         private  void winGridViewPager1_OnRefresh( object sender, EventArgs e)
        {
            BindData();
        }

         private  void winGridViewPager1_OnDeleteSelected( object sender, EventArgs e)
        {
             if (MessageUtil.ShowYesNoAndTips( " 您确定删除选定的记录么? ") == DialogResult.No)
            {
                 return;
            }

            DataGridView grid =  this.winGridViewPager1.dataGridView1;
             if (grid !=  null)
            {
                 foreach (DataGridViewRow row  in grid.SelectedRows)
                {
                     // BLLFactory<Customer>.Instance.Delete(row.Cells[0].Value.ToString());
                }
                BindData();
            }
        }

         private  void winGridViewPager1_OnEditSelected( object sender, EventArgs e)
        {
            DataGridView grid =  this.winGridViewPager1.dataGridView1;
             if (grid !=  null)
            {
                 foreach (DataGridViewRow row  in grid.SelectedRows)
                {
                    FrmEditCustomer dlg =  new FrmEditCustomer();
                    dlg.ID = row.Cells[ 0].Value.ToString();
                     if (DialogResult.OK == dlg.ShowDialog())
                    {
                        BindData();
                    }

                     break;
                }
            }
        }

         private  void winGridViewPager1_OnStartExport( object sender, EventArgs e)
        {
             string  where = GetSearchSql();
            PagerInfo info =  new PagerInfo();
            info.CurrenetPageIndex =  1;
            info.PageSize =  int.MaxValue;
             this.winGridViewPager1.AllToExport = FindToDataTable( where, info);
        }

         private  void winGridViewPager1_OnPageChanged( object sender, EventArgs e)
        {
            BindData();
        }

         #region 查询辅助函数

         ///   <summary>     
        
///  执行SQL查询语句,返回查询结果的所有记录的第一个字段,用逗号分隔。    
        
///   </summary>     
        
///   <param name="sql"> SQL语句 </param>     
        
///   <returns>     
        
///  返回查询结果的所有记录的第一个字段,用逗号分隔。    
        
///   </returns>     
         public  string SqlValueList( string sql)
        {
            SQLiteConnection connection =  new SQLiteConnection(connectionString);
            SQLiteCommand cmd =  new SQLiteCommand(sql, connection);

            connection.Open();
            StringBuilder result =  new StringBuilder();
             using (SQLiteDataReader dr = cmd.ExecuteReader())
            {
                 while (dr.Read())
                {
                    result.AppendFormat( " {0}, ", dr[ 0].ToString());
                }
            }

             string strResult = result.ToString().Trim( ' , ');
             return strResult;
        }

         ///   <summary>     
        
///  执行SQL查询语句,返回所有记录的DataTable集合。    
        
///   </summary>     
        
///   <param name="sql"> SQL查询语句 </param>     
        
///   <returns></returns>     
         public DataTable SqlTable( string sql)
        {
            DataSet ds =  new DataSet();
            SQLiteDataAdapter adpater =  new SQLiteDataAdapter(sql, connectionString);
            adpater.Fill(ds);
            
             return ds.Tables[ 0];
        }

         ///   <summary>
        
///  标准的记录查询函数
        
///   </summary>
        
///   <param name="where"></param>
        
///   <param name="pagerInfo"></param>
        
///   <returns></returns>
         private DataTable FindToDataTable( string  where, PagerInfo pagerInfo)
        {
            WHC.Pager.WinControl.PagerHelper helper =  new WHC.Pager.WinControl.PagerHelper( " All_Customer "" * "" LastUpdated ", pagerInfo.PageSize, pagerInfo.CurrenetPageIndex,  truewhere);
             string countSql = helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.SQLite,  true);
             string dataSql = helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.SQLite,  false);

             string value = SqlValueList(countSql);
            pagerInfo.RecordCount = Convert.ToInt32(value); // 为了显示具体的信息,需要设置总记录数
            DataTable dt = SqlTable(dataSql);
             return dt;
        }

         ///   <summary>
        
///  根据查询条件构造查询语句
        
///   </summary>
        
///   <returns></returns>
         private  string GetSearchSql()
        {
            SearchCondition condition =  new SearchCondition();
            condition.AddCondition( " Number "this.txtNumber.Text, SqlOperator.Like)
                .AddCondition( " Name "this.txtName.Text, SqlOperator.Like)
                .AddCondition( " Type "this.cmbType.Text, SqlOperator.Like)
                .AddCondition( " Area "this.cmbArea.Text, SqlOperator.Like)
                .AddCondition( " Address "this.txtAddress.Text, SqlOperator.Like)
                .AddCondition( " Company "this.txtCompany.Text, SqlOperator.Like)
                .AddCondition( " Note "this.txtNote.Text, SqlOperator.Like)
                .AddCondition( " Telephone1 "this.txtTelephone.Text, SqlOperator.Like,  true" Telephone ")
                .AddCondition( " Telephone2 "this.txtTelephone.Text, SqlOperator.Like,  true" Telephone ")
                .AddCondition( " Telephone3 "this.txtTelephone.Text, SqlOperator.Like,  true" Telephone ")
                .AddCondition( " Telephone4 "this.txtTelephone.Text, SqlOperator.Like,  true" Telephone ")
                .AddCondition( " Telephone5 "this.txtTelephone.Text, SqlOperator.Like,  true" Telephone ");

             if (chkUseDate.Checked)
            {
                condition.AddCondition( " CreateDate ", dateTimePicker1.Value.ToString( " yyyy-MM-dd "), SqlOperator.MoreThanOrEqual,  true)
                    .AddCondition( " CreateDate ", dateTimePicker2.Value.AddDays( 1).ToString( " yyyy-MM-dd "), SqlOperator.LessThanOrEqual,  true);

            }
             string  where = condition.BuildConditionSql().Replace( " Where """);
             return  where;
        } 
         #endregion

         private  void BindData()
        {
             #region 添加别名解析
             // DisplayColumns与显示的字段名或者实体属性一致,大小写不敏感,顺序代表显示顺序,用逗号或者|分开
             this.winGridViewPager1.DisplayColumns =  " Number,NAME,type,Area,Company,Address,Telephone1,Telephone2,Telephone3,Telephone4,Telephone5,CreateDate,Note,LastUpdated ";
             this.winGridViewPager1.AddColumnAlias( " ID "" 编号 ");
             this.winGridViewPager1.AddColumnAlias( " Number "" 客户编号 ");
             this.winGridViewPager1.AddColumnAlias( " Name "" 客户名称 ");
             this.winGridViewPager1.AddColumnAlias( " Type "" 客户类型 ");
             this.winGridViewPager1.AddColumnAlias( " Area "" 客户地区 ");
             this.winGridViewPager1.AddColumnAlias( " Company "" 客户单位 ");
             this.winGridViewPager1.AddColumnAlias( " Address "" 客户地址 ");
             this.winGridViewPager1.AddColumnAlias( " Telephone1 "" 电话1 ");
             this.winGridViewPager1.AddColumnAlias( " Telephone2 "" 电话2 ");
             this.winGridViewPager1.AddColumnAlias( " Telephone3 "" 电话3 ");
             this.winGridViewPager1.AddColumnAlias( " Telephone4 "" 电话4 ");
             this.winGridViewPager1.AddColumnAlias( " Telephone5 "" 电话5 ");
             this.winGridViewPager1.AddColumnAlias( " CreateDate "" 开户日期 ");
             this.winGridViewPager1.AddColumnAlias( " Shop_ID "" 分店ID ");
             this.winGridViewPager1.AddColumnAlias( " Note "" 备注 ");
             this.winGridViewPager1.AddColumnAlias( " LastUpdated "" 更新日期 ");

             #endregion

             string  where = GetSearchSql();
             this.winGridViewPager1.DataSource = FindToDataTable( wherethis.winGridViewPager1.PagerInfo);
        }

         private  void btnSearch_Click( object sender, EventArgs e)
        {
            BindData();
        } 

以上例子关键的地方有3个

1、 数据库字符串

connectionString = string.Format(@"Data Source={0}\OrderWater.db;Version=3;", Application.StartupPath); 

2.、查询数据操作

数据查询通过调用 System.Data.SQLite.DLL 的程序集实现数据访问操作,如下所示。

         public DataTable SqlTable( string sql)
        {
            DataSet ds =  new DataSet();
            SQLiteDataAdapter adpater =  new SQLiteDataAdapter(sql, connectionString);
            adpater.Fill(ds);
            
             return ds.Tables[ 0];
        } 

3、 SQLite分页语句调用生成 

调用内置的类实现分页语句的生成,代码如下所示。

            WHC.Pager.WinControl.PagerHelper helper =  new WHC.Pager.WinControl.PagerHelper( " All_Customer "" * "" LastUpdated ", pagerInfo.PageSize, pagerInfo.CurrenetPageIndex,  truewhere);
             string countSql = helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.SQLite,  true);

            string dataSql = helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.SQLite, false); 

完整可运行例子如下下载即可:

http://files.cnblogs.com/wuhuacong/TestPager_SqlLite.rar 

本文转自博客园伍华聪的博客,原文链接:Winform分页控件更新之集成Sqlite数据库分页,如需转载请自行联系原博主。



目录
相关文章
|
25天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
175 15
|
2月前
|
存储 SQL 数据库
数据库知识:了解SQLite或其他移动端数据库的使用
【10月更文挑战第22天】本文介绍了SQLite在移动应用开发中的应用,包括其优势、如何在Android中集成SQLite、基本的数据库操作(增删改查)、并发访问和事务处理等。通过示例代码,帮助开发者更好地理解和使用SQLite。此外,还提到了其他移动端数据库的选择。
52 8
|
3月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
50 4
|
3月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
77 3
|
3月前
|
应用服务中间件 PHP Apache
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
|
4月前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
104 2
|
4月前
|
数据库 数据库管理
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
244 1
|
3月前
|
存储 缓存 关系型数据库
sqlite 数据库 介绍
sqlite 数据库 介绍
58 0
|
4月前
|
JSON NoSQL 数据库
和SQLite数据库对应的NoSQL数据库:TinyDB的详细使用(python3经典编程案例)
该文章详细介绍了TinyDB这一轻量级NoSQL数据库的使用方法,包括如何在Python3环境中安装、创建数据库、插入数据、查询、更新以及删除记录等操作,并提供了多个编程案例。
183 0
|
5月前
|
SQL 存储 小程序
【教程】navicat配合HTTP通道远程连接SQLite数据库
本文介绍了如何通过 Navicat Premium 工具配合 n_tunnel_sqlite.php 和 HTTP 通道远程连接服务器上的 SQLite 数据库。SQLite 是一种自给自足的、无服务器的 SQL 数据库引擎,由于其端口未对外开放,直接使用 Navicat 进行远程连接不可行。文章详细记录了使用 HTTP 通道实现远程连接的过程,包括定位本地 `ntunnel_sqlite.php` 文件,将其上传至服务器,并通过 Navicat 配置 HTTP 通道连接 SQLite 数据库的具体步骤。
243 0
【教程】navicat配合HTTP通道远程连接SQLite数据库