关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法
关于PDF.NET开发框架的名字由来
在设计www.pwmis.com站点的时候,考虑到架构的兼容性和将来升级的可能性,最重要的是没有足够的时间去为网站添加和维护很多复杂的程序,所以在借鉴前人成功经验的基础上,设计了一套全新的快速数据处理框架 PWMIS Data Develop Framework,简称PDF。
本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.NET的LINQ(本框架成型于2006年,当时还未听说过LINQ)使用风格,设计了OQL查询表达式。本框架的设计思想是通用的,完全可以移植到Java 平台,现在只提供了.NET平台的实现,暂且将本框架命名为 PDF.NET(当前测试版 4.6.4.0528 )
关于我与此框架的关系
偶尔得知(看MOON.Orm对pdf cyq ClownFish等框架进行性能对比)这套框架不错,便想看看到底如何。从百度搜索,搜到官网,并下载阅读之。因为之前反编译了Moon.ORM,并把修改后的部分核心代码交给了原作者,就算促进中国软件的进步吧,一直想搞一套很厉害的底层,所以拜读之,写此文,并无任何攻击的恶意,因为我不喜欢那些天天喷的家伙,只为探讨技术并获取pdf svn账号获取最新代码而已。
首先我们先看查询细节,以MySql为例



-----------------------------------------------------------------------------------------
使用Offset方式
-----------------------------------------------------------------------------------------


说明了什么呢?即offset是把数据记录从0开始索引(0条,1条,2条.......)
先把PDF.NET原代码附上:
private static string MakePageSQLStringByMySQL_PgSQL(string strSQLInfo, string strWhere, int PageSize, int PageNumber, int AllCount, string offsetString)
{
strSQLInfo = strSQLInfo.Trim();
//去除末尾的分号
if (strSQLInfo.EndsWith(";"))
strSQLInfo = strSQLInfo.TrimEnd(';');
if (strWhere != null && strWhere != "")
{
strWhere = strWhere.Trim().ToUpper();
if (strWhere.StartsWith("WHERE "))
throw new Exception("附加查询条件不能带 where 谓词");
)
throw new Exception("附加查询条件不能带 ORDER BY 谓词");
strSQLInfo = "SELECT * FROM (" + strSQLInfo + ") temptable0 WHERE " + strWhere;
}
)
{
//生成统计语句
return "select count(*) from (" + strSQLInfo + ") ";
}
)
return strSQLInfo + " LIMIT " + PageSize;
int offset = PageSize * PageNumber;
if (offsetString == ",")//MySQL,感谢网友[左眼]发现此Bug
return strSQLInfo + " LIMIT " + offset + offsetString + PageSize;
else //PostgreSQL
return strSQLInfo + " LIMIT " + PageSize + offsetString + offset;
}
1.用pdf框架开发Mysql Sqlite PostgreSQL数据库的朋友在进行分页时要小心了,(PageNumber为2,即会查询出第3页的数据,依此类推......)。
2.用+号来进行字符串拼接,本人还是觉得StringBuilder要好,因为传入的strSQLInfo可能大量sql语句。效率.......
进过修改后的代码为:
private static string MakePageSQLStringByMySQL_PgSQL1(string strSQLInfo, string strWhere, int PageSize, int PageNumber, int AllCount, string offsetString)
{
strSQLInfo = strSQLInfo.Trim();
//去除末尾的分号
if (strSQLInfo.EndsWith(";"))
strSQLInfo = strSQLInfo.TrimEnd(';');
StringBuilder sb = new StringBuilder();
if (string.IsNullOrEmpty(strWhere))
{
sb.Append(strSQLInfo);
}
else
{
strWhere = strWhere.TrimStart();
if (strWhere.StartsWith("WHERE ", StringComparison.OrdinalIgnoreCase))
throw new Exception("附加查询条件不能带 where 谓词");
)
throw new Exception("附加查询条件不能带 ORDER BY 谓词");
sb.Append("SELECT * FROM (")
.Append(strSQLInfo)
.Append(") temptable0 WHERE ")
.Append(strWhere);
//sb.AppendFormat("SELECT * FROM ({0}) temptable0 WHERE {1}", strSQLInfo, strWhere);
}
)
{
//生成统计语句
sb.Insert(, "select count(*) from (").Append(") ");
}
else
{
);//应该是 PageSize * (PageNumber -1) 而不是 PageSize * PageNumber
sb.AppendFormat(" LIMIT {0} OFFSET {1}", PageSize, offset);
}
return sb.ToString();
}
最终测试代码:
//这么做是因为是查询的语句在实际环境下几乎每次不同,而字符串类的实现方式用了享元模式(同样的字符串内容,在内存中只有一个实例),所以我们用不同的 String实例
string strInfo = @"SELECT SelectField{0},SelectField{1},SelectField2,SelectField3,SelectField4,SelectField5,SelectField6,SelectField7 FROM
FROM TABLE{0}
ORDER BY OrderField1 DESC,OrderField2 ASC";
string where = " 1=1 and (name='张三' and age=20 and sex=0) or(game='过家家' and num={0} and num1={1}) ";
List<string> infoList = new List<string>();
List<string> whereList = new List<string>();
//准备测试数据
; i < ; i++)
{
infoList.Add());
whereList.Add());
}
//string page
Stopwatch sw = new Stopwatch();
sw.Start();
; i < ; i++)
{
MakePageSQLStringByMySQL_PgSQL(infoList[i], whereList[i], , i, , string.Empty);
}
sw.Stop();
;
//string count
sw.Restart();
; i < ; i++)
{
MakePageSQLStringByMySQL_PgSQL(infoList[i], whereList[i], , i, , string.Empty);
}
sw.Stop();
;
//StringBuilder page
sw.Restart();
; i < ; i++)
{
MakePageSQLStringByMySQL_PgSQL1(infoList[i], whereList[i], , i, , string.Empty);
}
sw.Stop();
;
//StringBuilder count
sw.Restart();
; i < ; i++)
{
MakePageSQLStringByMySQL_PgSQL1(infoList[i], whereList[i], , i, , string.Empty);
}
sw.Stop();
;
MessageBox.Show("构造分页语句: " + stringPageTime.ToString() + " 秒 构造count: " + stringCountTime.ToString() + " 秒\n"
+ "构造分页语句1:" + stringBuilderTime.ToString() + " 秒 构造count1:" + stringBuilderCountTime.ToString() + " 秒");
结果附上,大家可以自己测下:

关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法的更多相关文章
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...
- Redis/Mysql/SQLite/MongoDB 数据库对比
一.Redis: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...
- Fluent NHibernate and Mysql,SQLite,PostgreSQL
http://codeofrob.com/entries/sqlite-csharp-and-nhibernate.html https://code.google.com/archive/p/csh ...
- Mysql与PostgreSql数据库学习笔记---打酱油的日子
mysql 从最基础的数据引擎,到进程结构,都不能支持数据版本.导致其职能阻塞“并发”,不支持最基本的事务,innodb达不到基本事务要求,任何写数据,都导致整个表锁住.充其量只能算是一个玩具,或者说 ...
- docker 下mysql 和postgresql 数据库的搭建以及数据文件的迁移和备份
service docker start - docker 启动 service docker stop - docker 关闭 1.docker 镜像创建—使用的默认镜像有数据卷 docker pu ...
- Mysql与PostgreSql数据库学习笔记
mysql 从最基础的数据引擎,到进程结构,都不能支持数据版本.导致其职能阻塞“并发”,不支持最基本的事务,innodb达不到基本事务要求,任何写数据,都导致整个表锁住.充其量只能算是一个玩具,或者说 ...
- webstorm里用 DB browser 连接 mysql SQlite Oracle数据库
(1)插件名:DB browser preferences -> plugin -> 搜索 DB browser (2)在view里勾上 Tool Buttons,左侧会显示插件快捷入口 ...
- Mysql DB2等数据库分页的实现
一.Mysql的分页 (一).MySQL分页的实现,使用关键字:Limit 语法:select * from tableName Limit A,B; 注释:tableName:表名 A:查询的 ...
- 使用Jsp/Js/Ajax/Json/Jquery/Easyui + Servlet + JDBC + Lucene/Mysql/Oracle完成数据库分页
package loaderman.action; import java.io.IOException; import java.io.PrintWriter; import java.util.L ...
随机推荐
- Visual Studio-Sequence Diagram
UML Design Via Visual Studio-Sequence Diagram 本文主要介绍在Visual Studio中设计时序图,内容如下: 何时使用时序图 时序图元素介绍 条件.循环 ...
- mac os x10.11.2系统eclipse无法读取环境变量的问题
eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...
- 无废话WCF入门教程四[WCF的配置文件]
一.概述 配置也是WCF编程中的主要组成部分.在以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址.服务用于 ...
- Win8.1 Update如何禁用OneDrive同步服务
原文 Win8.1 Update如何禁用OneDrive同步服务 上周,IT之家为爱好者分享Win8.1 Update如何提高OneDrive上传速度教程.但是,由于国内特殊网络环境,导致微软OneD ...
- CSharp设计模式读书笔记(20):观察者模式(学习难度:★★★☆☆,使用频率:★★★★★)
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式的别名包括发布-订阅(Publish/ ...
- Openstack & Hadoop结合项目Sahara
Openstack 项目Sahara,主要是用来搭建Hadoop集群,利用虚拟出来的计算资源,高速搭建Hadoop集群. Sahara项目与OPenstack其它项目的关系: 图片转自:http:// ...
- Oracle推断领域包括中国
假设你要推断领域包括中国.有一个简单的方法. SQL> drop table test purge; SQL> create table test as select * from dba ...
- ECLIPSE实现了界面显示所有类
按下接口名称CTRL+T实现全面实施的接口类显示 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- final、finally、finalize差异
final.finally.finalize差异 1.final修饰符 它代表了一类是完美的类,它不能被继承,因此.一个类不能既被标记为final类别.同一时间被标记为abstract. 将变量或者函 ...
- POJ 3928 & HDU 2492 Ping pong(树阵评价倒数)
主题链接: PKU:http://poj.org/problem?id=3928 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Descript ...