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通用分页存储过程遇到的问题的更多相关文章

  1. MySql通用分页存储过程

    MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4 ...

  2. mysql通用分页存储过程遇到的问题(转载)

    mysql通用分页存储过程遇到的问题(转载) http://www.cnblogs.com/daoxuebao/archive/2015/02/09/4281980.html

  3. SQL Server 2008 通用分页存储过程

    1.alert USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[dbTab_PagerHelper] Script Date: 08/22/ ...

  4. SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

    SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...

  5. 支持DISTINCT的通用分页存储过程(SQL2005)

    /****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...

  6. SQL Server的通用分页存储过程 未使用游标,速度更快!

    经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路: 1.确定存储的输入参数: 1)SQL脚本,该参数接收完整的.正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 ...

  7. Oracle通用分页存储过程的创建与使用

    Oracle通用分页存储过程的创建与使用 1.创建Oracle包的定义.使用 REF CURSOR 数据类型来处理 Oracle 结果集.REF CURSOR 是一个指向 PL/SQL 查询所返回的结 ...

  8. Sql Server通用分页存储过程

    Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 ...

  9. mysql的分页存储过程,能够传出总记录数

    最近用mysql + asp.net来写网站,既然mysql已经支持存储过程了,那么像分页这么常用的东西,当然要用存储过程啦 不过在网上找了一些,发现都有一个特点——就是不能传出总记录数,干脆自己研究 ...

随机推荐

  1. .NET后台控制网页标签的ICO图标

    aspx文件的head属性中增加runat="server" 后台cs文件中: /// <summary> /// 客户端注册ICO图标 /// </summar ...

  2. R: 关于 table 函数的应用

    ################################################### 问题:关于 table 函数   18.5.9 来一个关于 table 函数的例子,说明tabl ...

  3. Umbraco项目发布错误 --More than one type want to be a model for content type authorize

    在开发项目时,解决方案下面包括三个项目 MyUmbracoProject MyUmbracoProject.Core MyUmbracoProject.FrontEnd 第一个项目MyUmbracoP ...

  4. 图解Laravel的生命周期

    先来张图大致理解下laravel的生命周期. 下面对应相应的代码,解释上图. //文件路径:laravel/public/index.php /** * laravel的启动时间 */ define( ...

  5. 7.27实习培训日志-Oracle SQL(三)

    Oracle SQL(三) 视图 特性 简单视图 复杂视图 关联的表数量 1个 1个或多个 查询中包含函数 否 是 查询中包含分组数据 否 是 允许对视图进行DML操作 是 否 CREATE [OR ...

  6. Vue packages version mismatch: 版本冲突;Error: EPERM: operation not permitted

    1.npm install vue-template-compiler@2.5.3 出现此问题 npm ERR! path G:\XXX.Web\node_modules\fsevents\node_ ...

  7. Fiddler开启Https的时候出现unable to configure windows to trust Fiddler Root certificate问题

    前言 通过log页面看到错误为:访问控制列表(ACL)结构无效. 网上(baidu,bing,google)各种方式都试过了: 如重置证书(Reset all certificates) 导出证书到本 ...

  8. rxjs入门6之合并数据流

    一 concat,merge,zip,combineLatest等合并类操作符 以上操作符在版本6中已经只存在静态方法,不能在pipe中使用. import {concat,merge,zip,com ...

  9. Codeforces Round #518 (Div. 2) D(计数DP)

    #include<bits/stdc++.h>using namespace std;const long long mod=998244353;int n;int a[100007];l ...

  10. 定时器详解和应用、js加载阻塞、css加载阻塞

    1.setTimeout().setInterval()详解和应用 1.1 详解: setTimeout.setInterval执行时机 1.2 存在问题: setInterval重复定时器可能存在的 ...