既然朋友需要,那就得研究下,并提供相关的支持,经过一番小修改,即可完成内容的Sqlite分页支持了。在给出相关的分页实现例子之前,我们介绍一下,为什么项目使用Sqlite而不是使用Access数据库,他们之间有那些特点。
1、Access特点
我们做小项目的时候特别是小的MIS系统一般也都要用数据库来保存数据,大部分的小系统都是用Access数据库,Access使用上确实非常方便,也方便对数据进行管理维护等优点,复制过去即可使用。但其实Access数据库本身也存在很多的问题:性能不行;数据不安全,用户可以直接用Access打开数据库文件进行数据修改,即使加密后都可以直接破解;Access的数据量一大,文件本身的体积就异常庞大;Access数据库文件很容易损坏等。
2、 SQLite特点
事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
零配置——不需要安装和管理。
实现了绝大多数SQL92标准。
整个数据库存储在一个单一的文件中。
数据库文件可以在不同字节序的机器之间自由地共享。
支持最大可达2T的数据库。 (241 字节)
字符串和BLOB类型的大小最大可达 2G 字节(231字节)。
小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。
在大多数常见操作上比流行的客户/服务器数据库引擎更快。
简单,易于使用的API。
内建TCL绑定。 另外提供可用于许多其他语言的绑定。
具有良好注释的源代码,95%经过测试。
独立:没有外部依赖。
源代码位于公共域。 可用于任何用途。
朋友介绍操作SQLite使用工具SQLiteSpy,实际上这个工具不支持数据库(如Access数据库)的导入,偶然发现还有SQLite Developer这样一个工具,管理上非常方便,操作图如下所示,使用发现功能比较丰富,支持对表字段定义的直接修改,编辑数据、Sql查询、创建、压缩、备份数据库等,对中文支持也不错。
言归正题,介绍完毕一些SQLite的使用后,继续介绍分页控件如何实现SQLite的分页处理吧。
普通版本的分页控件呈现效果如下所示。
DevExpress样式版本的分页控件效果如下所示(均支持SQLite分页)
基于SqlLite数据库的分页控件使用例子代码如下:
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, true, where);
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( where, this.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 的程序集实现数据访问操作,如下所示。
{
DataSet ds = new DataSet();
SQLiteDataAdapter adpater = new SQLiteDataAdapter(sql, connectionString);
adpater.Fill(ds);
return ds.Tables[ 0];
}
3、 SQLite分页语句调用生成
调用内置的类实现分页语句的生成,代码如下所示。
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数据库分页,如需转载请自行联系原博主。