您的位置:首页 > 数据库

SQL:分页存储过程(优化了部分语句,附C#调用接口)

2011-01-06 11:30 666 查看
网上分页存储过程的代码很多,这个是我一直在用的经典的三层架构里提取出来的,并做了部分语句的优化...

如有更好的欢迎讨论!

.[TP_GetRecordByPage]
@tblName      varchar(255),       -- 表名
@fldName      varchar(255),       -- 主键字段名
@PageSize     int = 10,           -- 页尺寸
@PageIndex    int = 1,            -- 页码
@IsReCount    bit = 0,            -- 返回记录总数, 非 0 值则返回
@OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
@strWhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(800)        -- 临时变量(查询条件过长时可能会出错,可修改100为1000)
declare @strOrder varchar(400)        -- 排序类型

if @OrderType != 0
begin
set @strTmp = '<]命名空间改为你的,需要引用DBUtility操作类。

/// <summary>
/// 得到记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
public static int GetRecordCount(string tableName)
{
return GetRecordCount(tableName, "");
}
/// <summary>
/// 得到记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="strWhere">筛选条件(可以不用加where)</param>
/// <returns></returns>
public static int GetRecordCount(string tableName, string strWhere)
{
string strsql = string.Empty;
if (string.IsNullOrEmpty(strWhere))
strsql = "select count(*) from " + tableName;
else
strsql = "select count(*) from " + tableName + " where " + strWhere;
object obj = TopkeeOA.DBUtility.DbHelperSQL.GetSingle(strsql);
if (obj == null)
{
return 0;
}
else
{
return int.Parse(obj.ToString());
}
}

/// <summary>
/// 分页获取数据列表(分页)
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="PageSize">每页显示多少要记录</param>
/// <param name="PageIndex">当前页</param>
/// <param name="strWhere">筛选条件(可为空)</param>
/// <param name="FieldName">排序字段(一般为主键ID)</param>
/// <param name="OrderType">排序类型(1为降序,0为升序)</param>
/// <returns></returns>
public static DataSet GetList(string tableName, int PageSize, int PageIndex, string strWhere, string FieldName, int OrderType)
{
SqlParameter[] parameters = {
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@IsReCount", SqlDbType.Bit),
new SqlParameter("@OrderType", SqlDbType.Bit),
new SqlParameter("@strWhere", SqlDbType.VarChar,1000),
};
parameters[0].Value = tableName;
parameters[1].Value = FieldName;
parameters[2].Value = PageSize;
parameters[3].Value = PageIndex;
parameters[4].Value = 0;
parameters[5].Value = OrderType;
parameters[6].Value = strWhere;
return TopkeeOA.DBUtility.DbHelperSQL.RunProcedure("TP_GetRecordByPage", parameters, "ds");
}


第一次使用请把“ALTER PROCEDURE ”改为“CREATE PROCEDURE ”以便创建一个新的存储过程。

AspNetPager调用示例:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[TP_GetRecordByPage2005]
@tableName varchar(50),			--表名
@fields varchar(2000) = '*',		--字段名(全部字段为*)
@orderField varchar(500),			--排序字段(必须!支持多字段)
@sqlWhere varchar(2000) = Null,	--条件语句(不用加where)
@pageSize int,                     --每页显示多少条记录
@pageIndex int = 1 ,				--指定当前为第几页
@orderType int = 1,				--排序方式,非0则降序
@TotalPage int output				--返回总页数
as
begin
Begin Tran --开始事务
Declare @sql nvarchar(4000);
Declare @totalRecord int;
Declare @sort varchar(10);

if @orderType != 0
set @sort = ' DESC'
else
set @sort = ' ASC'

--计算总记录数
if (@SqlWhere='' or @sqlWhere=NULL)
set @sql = 'select @totalRecord = count(*) from ' + @tableName
else
set @sql = 'select @totalRecord = count(*) from ' + @tableName + ' where ' + @sqlWhere
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数

--计算总页数
select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
if (@SqlWhere='' or @sqlWhere=NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @orderField + @sort + ') as RowNum,' + @fields + ' from ' + @tableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @orderField + @sort + ') as RowNum,' + @fields + ' from ' + @tableName + ' where ' + @SqlWhere

--处理页数超出范围情况
if @PageIndex<=0
Set @pageIndex = 1

if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage

--处理开始点和结束点
Declare @StartRecord int
Declare @EndRecord int

set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1

--继续合成sql语句
set @Sql = @Sql + ') as ' + @tableName + ' where RowNum between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)

Exec(@Sql)
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @totalRecord ---返回记录总数
End
end


以下是C#通用调用接口,需要引用DBUtility操作类

#region 公用存储过程分页相关操作
/// <summary>
/// 得到记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
public static int GetRecordCount(string tableName)
{
return GetRecordCount(tableName, "");
}
/// <summary>
/// 得到记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="strWhere">筛选条件(可以不用加where)</param>
/// <returns></returns>
public static int GetRecordCount(string tableName, string strWhere)
{
string strsql = string.Empty;
if (string.IsNullOrEmpty(strWhere))
strsql = "select count(*) from " + tableName;
else
strsql = "select count(*) from " + tableName + " where " + strWhere;
object obj = TK.DBUtility.DbHelperSQL.GetSingle(strsql);
if (obj == null)
{
return 0;
}
else
{
return int.Parse(obj.ToString());
}
}

/// <summary>
/// 分页获取数据列表(分页)
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="orderField">排序字段(必须!支持多字段,PS:多个字段用","分割,一般不为空,为空时默认为"ID")</param>
/// <param name="sqlWhere">附加条件语句(不用加where),可为空</param>
/// <param name="pageSize">每页显示多少条记录</param>
/// <param name="pageIndex">指定当前为第几页</param>
/// <param name="OrderType">排序方式,非0则降序</param>
/// <returns></returns>
public static DataSet GetList(string tableName, string orderField, string sqlWhere, int pageSize, int pageIndex, int OrderType)
{
return GetList(tableName, "*", orderField, sqlWhere, pageSize, pageIndex, OrderType);
}

/// <summary>
/// 分页获取数据列表(分页)
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="fields">字段名(PS:可为空,为空时显示全部字段,显示全部字段为"*")</param>
/// <param name="orderField">排序字段(必须!支持多字段,PS:多个字段用","分割,一般不为空,为空时默认为"ID")</param>
/// <param name="sqlWhere">附加条件语句(不用加where),可为空</param>
/// <param name="pageSize">每页显示多少条记录</param>
/// <param name="pageIndex">指定当前为第几页</param>
/// <param name="OrderType">排序方式,非0则降序</param>
/// <returns></returns>
public static DataSet GetList(string tableName, string fields, string orderField, string sqlWhere, int pageSize, int pageIndex, int OrderType)
{

SqlParameter[] parameters = {
new SqlParameter("@tableName", SqlDbType.VarChar, 50),
new SqlParameter("@fields", SqlDbType.VarChar, 2000),
new SqlParameter("@orderField", SqlDbType.VarChar, 500),
new SqlParameter("@sqlWhere", SqlDbType.VarChar,2000),
new SqlParameter("@pageSize", SqlDbType.Int),
new SqlParameter("@pageIndex", SqlDbType.Int),
new SqlParameter("@orderType", SqlDbType.Int),
new SqlParameter("@TotalPage", SqlDbType.Int)
};
parameters[0].Value = tableName;
parameters[1].Value = string.IsNullOrEmpty(fields) ? "*" : fields;
parameters[2].Value = string.IsNullOrEmpty(orderField) ? "ID" : orderField;
parameters[3].Value = string.IsNullOrEmpty(sqlWhere) ? "" : sqlWhere;
parameters[4].Value = pageSize;
parameters[5].Value = pageIndex;
parameters[6].Value = OrderType;
parameters[7].Direction = ParameterDirection.Output;

return TK.DBUtility.DbHelperSQL.RunProcedure("TP_GetRecordByPage2005", parameters, "ds");
}
#endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: