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已经支持存储过程了,那么像分页这么常用的东西,当然要用存储过程啦 不过在网上找了一些,发现都有一个特点——就是不能传出总记录数,干脆自己研究 ...
随机推荐
- Jenkins配置邮件SMTP(使用QQ邮箱)
一.QQ邮箱中开启SMTP服务 进入QQ邮箱的设置页面,选择开启POP3/SMTP服务 需要发送一条短信开启服务,成功后,会收到一个密码,一定要截图.复制密码保存好 二.Jenkins中配置SMTP ...
- 用JSP输出Hello World
------------------siwuxie095 在 Eclipse 的 Package Explorer,右键->New-> ...
- 6、RNA-Seq Analysis Pipeline
Created by Dhivya Arasappan, last modified by Dennis C Wylie on Nov 08, 2015 This pipeline uses an a ...
- linux中制作动态库
制作一个动态库我们可以使用gcc工具来制作一个动态库示例:自己制作一个动态库,库函数的功能是传递一个字符串并输出.第一步:需要准备3个文件:hello.h.hello.c.test.c.其中hello ...
- appium+python+jenkins+selenium grid+unnittest+生成报告打造UI自动化回归、监控体系
先放一下截图,展示一下平台做成的样子,以及实现后的结果,后面贴上自动化用例执行的过程中,帮我们发现的线上问题 关于appium自动化环境的安装,网上有很多教程,我就不重复赘述,后面陆续写出设计思想,贴 ...
- setTimeout关于函数名做参数的问题
前几天在调bug时发现一个诡异的问题. function test(){ alert('4 seconds!'); } setTimeout(test(),4000); 这段代码立即执行,当时看不出问 ...
- idea调试SpringMvc, 出现:”Can't find catalina.jar"错误的解决方法
用gradle构建的项目,点击运行出现以下错误提示: Error running PraticeWeb: Can't find catalina.jar 21:54 Error running Pra ...
- Sharepoint2013商务智能学习笔记之简单概述(一)
SharePoint 2013 中的商业智能 (BI) 提供集 Microsoft Office 应用程序和其他 Microsoft 技术于一体的全面的 BI 工具.这些 BI 工具有:Excel 2 ...
- Linux系统及lvm知识
一.磁盘分区是怎样表示的 IDE磁盘的设备文件采用/dev/hdx 来命名,分区则采用/dev/hdxy来命名,其中想表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推),与代表分区的号码(由1开始, ...
- The Little Prince
Chapter 1 That is why, at the age of six, I gave up what might have been a magnificant career as a p ...