mysql通用分页存储过程遇到的问题
DELIMITER $$ USE `tsb_asksys`$$ DROP PROCEDURE IF EXISTS `P_viewPage`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `P_viewPage`(
$TableName VARCHAR(200),/*表名*/
$FieldList VARCHAR(2000), /*显示列名*/
$PrimaryKey VARCHAR(100), /*单一主键或唯一值键*/
$WhereStr VARCHAR(1000), /*查询条件 不含'where'字符*/
$OrderStr VARCHAR(1000), /*排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效*/
$SortType INT, /*排序规则 1:正序asc 2:倒序desc 3:多列排序*/
$RecorderCount INT, /*记录总数 0:会返回总记录*/
$PageSize INT, /*每页输出的记录数*/
$PageIndex INT, /*当前页数*/
OUT $TotalCount INTEGER, /*返回记录总数*/
OUT $TotalPageCount INTEGER /*返回总页数*/
)
BEGIN
IF !(($TableName IS NULL OR $TableName='') OR ($FieldList IS NULL OR $FieldList='') OR ($PrimaryKey IS NULL OR $PrimaryKey='') OR $SortType < 1 OR $SortType >3 OR $RecorderCount < 0 OR $PageSize < 0 OR $PageIndex < 0) THEN
IF ($WhereStr IS NULL OR $WhereStr='') THEN
SET @new_where1 = ' ' ;
SET @new_where2 = ' WHERE ' ;
ELSE
SET @new_where1 =CONCAT(' WHERE ',$WhereStr);
SET @new_where2 =CONCAT(' WHERE ',$WhereStr,' AND ');
END IF;
IF $OrderStr='' OR $SortType = 1 OR $SortType = 2 THEN
IF $SortType = 1 THEN
SET @new_order =CONCAT(' ORDER BY ',$PrimaryKey,' ASC' );
END IF;
IF $SortType = 2 THEN
SET @new_order =CONCAT(' ORDER BY ',$PrimaryKey,' DESC');
END IF;
ELSE
SET @new_order =CONCAT(' ORDER BY ',$OrderStr);
END IF;
SET @SqlCount = CONCAT('SELECT COUNT(*) into @TotalCount FROM ',$TableName,@new_where1);
SET @SqlCount1 = CONCAT('SELECT CEILING((COUNT(*)+0.0)/',$PageSize,') into @TotalPageCount FROM ',$TableName,@new_where1);
IF $RecorderCount = 0 THEN
PREPARE stmt1 FROM @SqlCount;
EXECUTE stmt1;
SET $TotalCount=@TotalCount;
PREPARE stmt1 FROM @SqlCount1;
EXECUTE stmt1;
SET $TotalPageCount=@TotalPageCount;
ELSE
SET $TotalCount = $RecorderCount;
END IF;
IF $PageIndex > CEILING(($TotalCount+0.0)/$PageSize) THEN
SET $PageIndex = CEILING(($TotalCount+0.0)/$PageSize);
END IF;
IF $PageIndex = 0 OR $PageIndex = 1 THEN
SET @Sql=CONCAT('SELECT ',$FieldList,' FROM ',$TableName,@new_where1,@new_order,' limit ',$PageSize);
ELSE
IF $SortType = 1 THEN
SET @Sql=CONCAT('SELECT ',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,' > (SELECT max(',$PrimaryKey,') FROM (SELECT ',$PrimaryKey,' FROM ',$TableName,@new_where1,@new_order,' limit ',$PageSize*($PageIndex-1),' ) AS TMP) ',@new_order,' limit ',$PageSize);
END IF;
IF $SortType = 2 THEN
SET @Sql=CONCAT('SELECT ',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,' < (SELECT MIN(',$PrimaryKey,') FROM (SELECT ',$PrimaryKey,' FROM ',$TableName,@new_where1,@new_order,' limit ',$PageSize*($PageIndex-1),' ) AS TMP) ',@new_order,' limit ',$PageSize);
END IF;
IF $SortType = 3 THEN
/*IF INSTR($OrderStr,',') > 0 THEN
SET @Sql=CONCAT('SELECT ',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,' NOT IN (SELECT ',$PrimaryKey,' FROM (SELECT ',$PrimaryKey,' FROM ',$TableName,@new_where1,@new_order,' limit ',$PageSize*($PageIndex-1),' ) a)',@new_order,' limit ',$PageSize);
ELSE
SET @new_order =CONCAT(' ORDER BY ',$PrimaryKey,' ASC' );
SET @Sql=CONCAT('SELECT ',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,' > (SELECT max(',$PrimaryKey,') FROM (SELECT ',$PrimaryKey,' FROM ',$TableName,@new_where1,@new_order,' limit ',$PageSize*($PageIndex-1),' ) AS TMP) ',@new_order,' limit ',$PageSize);
END IF;*/
SET @Sql=CONCAT('SELECT ',$FieldList,' FROM ',$TableName,@new_where2,$PrimaryKey,' NOT IN (SELECT ',$PrimaryKey,' FROM (SELECT ',$PrimaryKey,' FROM ',$TableName,@new_where1,@new_order,' limit ',$PageSize*($PageIndex-1),' ) a)',@new_order,' limit ',$PageSize);
END IF;
END IF;
PREPARE stmt2 FROM @Sql;
EXECUTE stmt2;
END IF;
END$$ DELIMITER ;
以上存储过程是在网上找的,使用过程中遇到的问题是,当查询第二页及以后页内容时无法获得。
以下是解决办法,备注中说的非常清楚:
static public DataTable getAllUser(int PageSize, int CurrPageIndex, out int AllRecordCount, String _SearchWhere)
{
using (MySqlCommand cmd = new MySqlCommand("P_viewPage"))
{
cmd.CommandType = CommandType.StoredProcedure; //设置表名称:
System.Text.StringBuilder TableName = new System.Text.StringBuilder();
TableName.Append(" GQShowV_UserInfoForAdmin t1 ");
cmd.Parameters.AddWithValue("@$TableName", TableName.ToString());//对表名参数赋值 //设置字段名称:
System.Text.StringBuilder myfld_str = new System.Text.StringBuilder();
myfld_str.Append(" t1.RecordID, t1.UserID, t1.LoginID, t1.Nickname,t1.SexID_Exp,t1.UserEmail_Exp,t1.CreateDate,t1.UserName,t1.Phone, t1.Tel,t1.IsAdmin_Exp ");
cmd.Parameters.AddWithValue("@$FieldList", myfld_str.ToString());//对字段参数赋值 //设置按哪个字段进行排序
cmd.Parameters.AddWithValue("@$OrderStr", "t1.createDate DESC");// --排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效 /*设置排序方式,规则说明:1是按照PrimaryKey正序asc;2按照PrimaryKey倒序desc;
3按照非关键字或多关键字排序,比如日期,排序字段后可跟asc或desc,如t1.createDate DESC或t1.createDate DESC,t1.other asc
另外请注意:排序方式只有1,2,3,其他数字不会从数据库中读出数据*/
cmd.Parameters.AddWithValue("@$SortType", );//--排序规则 1:正序asc 2:倒序desc 3:多列排序 //设置主表的关键字,切记:主键前不要加前缀,否则第二页及以后页内容无法读出
cmd.Parameters.AddWithValue("@$PrimaryKey", "UserID");//t1.UserID 第二页不会显示出来,因为有前缀
//设置总查询记录数:为0时,查询实际记录,主要解决表记录非常大,那么可以限制只查询10万条记录这样的问题
cmd.Parameters.AddWithValue("@$RecorderCount", );
//设置查询条件
System.Text.StringBuilder query_where = new StringBuilder();//保存查询条件
query_where.Append(" (1 = 1) "); if (!String.IsNullOrEmpty(_SearchWhere))
{
query_where.AppendFormat("and (t1.UserName LIKE N'%{0}%')", _SearchWhere);
} cmd.Parameters.AddWithValue("@$WhereStr", query_where.ToString());//设置查询条件 //设置每页要显示的记录数
cmd.Parameters.AddWithValue("@$PageSize", PageSize);
//设置要显示的页码:
cmd.Parameters.AddWithValue("@$PageIndex", CurrPageIndex);
//保存查询到的总记录数 MySqlParameter record_num = new MySqlParameter();
record_num = cmd.Parameters.Add(new MySqlParameter("@$TotalCount", SqlDbType.Int));
record_num.Direction = ParameterDirection.Output;
//
int _TotalPageCount = ;
MySqlParameter TotalPageCount = new MySqlParameter();
TotalPageCount = cmd.Parameters.Add(new MySqlParameter("@$TotalPageCount", SqlDbType.Int));
TotalPageCount.Direction = ParameterDirection.Output; using (DataTable dt = ObjectMindDBForMysql.MySqlHelper.GetData(cmd))
{
AllRecordCount = int.Parse(cmd.Parameters["@$TotalCount"].Value.ToString());
_TotalPageCount = int.Parse(cmd.Parameters["@$TotalPageCount"].Value.ToString());
return dt;
}
}
}
以上内容转自:http://www.taoshibao.com/q/5265816609616735182
mysql通用分页存储过程遇到的问题的更多相关文章
- MySql通用分页存储过程
MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4 ...
- mysql通用分页存储过程遇到的问题(转载)
mysql通用分页存储过程遇到的问题(转载) http://www.cnblogs.com/daoxuebao/archive/2015/02/09/4281980.html
- SQL Server 2008 通用分页存储过程
1.alert USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[dbTab_PagerHelper] Script Date: 08/22/ ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- 支持DISTINCT的通用分页存储过程(SQL2005)
/****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...
- SQL Server的通用分页存储过程 未使用游标,速度更快!
经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路: 1.确定存储的输入参数: 1)SQL脚本,该参数接收完整的.正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 ...
- Oracle通用分页存储过程的创建与使用
Oracle通用分页存储过程的创建与使用 1.创建Oracle包的定义.使用 REF CURSOR 数据类型来处理 Oracle 结果集.REF CURSOR 是一个指向 PL/SQL 查询所返回的结 ...
- Sql Server通用分页存储过程
Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 ...
- mysql的分页存储过程,能够传出总记录数
最近用mysql + asp.net来写网站,既然mysql已经支持存储过程了,那么像分页这么常用的东西,当然要用存储过程啦 不过在网上找了一些,发现都有一个特点——就是不能传出总记录数,干脆自己研究 ...
随机推荐
- Sql server 时间格式转化
--.SQL时间格式转化 --日期转换参数 ) --2009-03-15 15:10:02 ),'-',''),' ',''),':','') ) , ) --2009/03/15 ) , ) ) , ...
- 【java并发编程艺术学习】(二)第一章 java并发编程的挑战
章节介绍 主要介绍并发编程时间中可能遇到的问题,以及如何解决. 主要问题 1.上下文切换问题 时间片是cpu分配给每个线程的时间,时间片非常短. cpu通过时间片分配算法来循环执行任务,当前任务执行一 ...
- Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder
1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...
- Java有几种引用类型?
有这样一类对象:当内存空间还足够,则可保留在内存中:如果内存空间在gc之后还是非常紧张,则可抛弃这些对象.很多系统的缓存功能适合这样的场景,所以jdk1.2以后 java将引用分为了强引用.软引用.弱 ...
- zookeeper-3.4.5-cdh5.1.0 完全分布式安装
1.环境 主机名 IP地址 JDK ZooKeeper myid c1 192.168.58.129 1.7.0_11 server.1 1 c2 192.168.58.130 1.7.0_11 se ...
- kinect2跑高博的orbslam2的过程(仅供自己参考记录)
首先感谢高博的无私奉献!http://www.cnblogs.com/gaoxiang12/p/5161223.html 程序所在的目录为:/home/zty/catkin_ws/src/iai_ki ...
- Eclipse插件无法识别的解决方法汇总
参考 http://www.cnblogs.com/apollolee/archive/2013/06/18/3142243.html
- ProtoBuf练习(六)
JSON类型 工程目录结构 $ ls proto/ proto文件 $ cat proto/style.proto syntax = "proto3"; import " ...
- es6- Generator函数实现长轮询
1.Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. 语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态.形式上,Gene ...
- 外企面试,哪有你想象的那么难!(已收埃森哲、NTTDATA等8家外企offer)
无精疯,一名背包客,大学期间穷游了十余个国家,五十余座城市,也是一位拥有健身教练证的业余健身痴迷者.从大二开始自学Java并开始了第一份实习,后面也是通过自学转到了大数据,之前在一家大数据独角兽实习, ...