关于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数据库分页支持的个人看法的更多相关文章

  1. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  2. Redis/Mysql/SQLite/MongoDB 数据库对比

    一.Redis: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  3. Fluent NHibernate and Mysql,SQLite,PostgreSQL

    http://codeofrob.com/entries/sqlite-csharp-and-nhibernate.html https://code.google.com/archive/p/csh ...

  4. Mysql与PostgreSql数据库学习笔记---打酱油的日子

    mysql 从最基础的数据引擎,到进程结构,都不能支持数据版本.导致其职能阻塞“并发”,不支持最基本的事务,innodb达不到基本事务要求,任何写数据,都导致整个表锁住.充其量只能算是一个玩具,或者说 ...

  5. docker 下mysql 和postgresql 数据库的搭建以及数据文件的迁移和备份

    service docker start - docker 启动 service docker stop - docker 关闭 1.docker 镜像创建—使用的默认镜像有数据卷 docker pu ...

  6. Mysql与PostgreSql数据库学习笔记

    mysql 从最基础的数据引擎,到进程结构,都不能支持数据版本.导致其职能阻塞“并发”,不支持最基本的事务,innodb达不到基本事务要求,任何写数据,都导致整个表锁住.充其量只能算是一个玩具,或者说 ...

  7. webstorm里用 DB browser 连接 mysql SQlite Oracle数据库

    (1)插件名:DB browser preferences -> plugin -> 搜索 DB browser (2)在view里勾上 Tool Buttons,左侧会显示插件快捷入口 ...

  8. Mysql DB2等数据库分页的实现

    一.Mysql的分页 (一).MySQL分页的实现,使用关键字:Limit    语法:select * from tableName Limit A,B; 注释:tableName:表名 A:查询的 ...

  9. 使用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 ...

随机推荐

  1. MVC提交时验证

    第一种 @using (Html.BeginForm("ProdPromotionEdit", "Product", FormMethod.Post, new ...

  2. 【地图API】为何您的坐标不准?如何纠偏?

    原文:[地图API]为何您的坐标不准?如何纠偏? 摘要:各种坐标体系之间如何转换?到底有哪些坐标体系?什么是火星坐标?为什么我的坐标,在地图上显示会有偏移?本文详细解答以上问题.最后给出坐标拾取工具. ...

  3. set RowCount 与 top n

    有时,采用top n中间n它是一个变量,这将需要使用()去完成: declare @count1 int set @count1 = 8 select top <strong>(@coun ...

  4. 内存排查 valgrind

    内存问题排查工具 --- valgrind 1. 概述 2. Valgrind 3. 内存泄漏监测 3.1. 示例代码 3.2. 编译它 3.3. 用Valgrind监测进程的内存泄漏 4. 悬挂指针 ...

  5. 完整具体解释GCD系列(二)dispatch_after;dispatch_apply;dispatch_once

    原创Blog,转载请注明出处 本文阅读的过程中,如有概念不懂,请參照前专栏中之前的文章,假设还有疑惑,请留言. 这是我关于GCD专栏的地址 http://blog.csdn.net/column/de ...

  6. MVC4

    MVC4 本地正常运行,发布到IIS7->403 - 禁止访问: 访问被拒绝. 摘要: 上周五代码编写完成,计划发布一个版本测试,没想到发布到IIS7 竟然报错“403-禁止访问”.还真第一次遇 ...

  7. linux cat

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [file] 或 cut ...

  8. 浅谈JavaScript性能

    最近在JavaScript性能方面有所感悟,把我的经验分给大家: 说到JavaScript,就不得不说它的代码的运行速度—— 在我初学JavaScript的时候,只是觉得它是一个很强大的脚本.渐渐的, ...

  9. C#函数式编程-高阶函数

    随笔分类 -函数式编程 C#函数式编程之标准高阶函数 2015-01-27 09:20 by y-z-f, 344 阅读, 收藏, 编辑 何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的 ...

  10. 4. SQL Server数据库状态监控 - 作业状态

    原文:4. SQL Server数据库状态监控 - 作业状态 有很多地方可以设置定时任务,比如:Windows的计划任务,Linux下的crontab,各种开发工具里的timer组件.SQL Serv ...