您的位置:首页 > 其它

一个很好用的存储过程分页

2008-06-14 16:43 369 查看
在网上找过几个存储过程分页,觉得NickLee的最好用,原帖点这里,这里转一下,也修改了一些错误

[align=left]/*****************************************************************[/align]
[align=left]* 存储过程名: GetCustomersDataPage [/align]
[align=left]* 过程描述: 通用大数据集分页[/align]
[align=left]* 传入参数:[/align]
[align=left]* 传出参数:[/align]
[align=left]* 修改记录[/align]
[align=left]* 姓名 日期 修改类型[/align]
[align=left]* NickLee 2005-- 新建[/align]
[align=left]*[/align]
[align=left]*[/align]
[align=left]*[/align]
[align=left]*[/align]
[align=left]*[/align]
[align=left]******************************************************************/[/align]
[align=left]-- 获取指定页的数据[/align]
[align=left] [/align]
[align=left]CREATE PROCEDURE [GetCustomersDataPage] [/align]
[align=left] @PageIndex INT, --页面索引,从datagrid中获取[/align]
[align=left] @PageSize INT, --页面显示数量,从datagrid中获取[/align]
[align=left] @RecordCount INT OUT, --返回记录总数[/align]
[align=left] @PageCount INT OUT, --返回分页后页数[/align]
[align=left] @strGetFields nvarchar(1000), -- 需要查询的列[/align]
[align=left] @tableName nvarchar(500) , --表名称[/align]
[align=left] @ID nvarchar(100), --主键,(为表的主键)[/align]
[align=left] @strWhere nvarchar(1000) ='', -- 查询条件(注意: 不要加where)[/align]
[align=left] @sortName nvarchar(50) =' asc ' , --排序方式[/align]
[align=left] @orderName nvarchar(100) --父级查询排序方式[/align]
[align=left] [/align]
[align=left]AS[/align]
[align=left]declare @countSelect nvarchar(2000) [/align]
[align=left]--设置统计查询语句[/align]
[align=left]if len(@strWhere) =0 [/align]
[align=left]--如果没有查询条件[/align]
[align=left] begin[/align]
[align=left] set @countSelect=N'SELECT @CountRecord = COUNT(*) FROM '+@tableName[/align]
[align=left] end[/align]
[align=left]else[/align]
[align=left]--否则[/align]
[align=left] begin[/align]
[align=left] set @countSelect=N'SELECT @CountRecord = COUNT(*) FROM '+@tableName+' where '+@strWhere[/align]
[align=left] end[/align]
[align=left]--执行并返回总数[/align]
[align=left]exec sp_executesql @countSelect,N'@CountRecord int output',@RecordCount output[/align]
[align=left]SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize) [/align]
[align=left] [/align]
[align=left]SET NOCOUNT ON[/align]
[align=left] [/align]
[align=left]DECLARE @SQLSTR NVARCHAR(3000)[/align]
[align=left]--实际总共的页码小于当前页码或者最大页码[/align]
[align=left]if @PageCount>=0[/align]
[align=left] --如果分页后页数大于[/align]
[align=left] begin[/align]
[align=left] if @PageCount<=@PageIndex and @PageCount>0 --如果实际总共的页数小于datagrid索引的页数[/align]
[align=left] --or @PageCount=1[/align]
[align=left] begin[/align]
[align=left] --设置为最后一页[/align]
[align=left] set @PageIndex=@PageCount-1[/align]
[align=left] end[/align]
[align=left] else if @PageCount<=@PageIndex and @PageCount=0[/align]
[align=left] begin[/align]
[align=left] set @PageIndex=0;[/align]
[align=left] end[/align]
[align=left] end[/align]
[align=left] [/align]
[align=left]IF @PageIndex = 0 OR @PageCount <= 1 --如果为第一页[/align]
[align=left] begin[/align]
[align=left] if len(@strWhere) =0[/align]
[align=left] begin[/align]
[align=left] SET @SQLSTR =N'SELECT TOP '+STR( @PageSize )+@strGetFields+' FROM '+@tableName+' ORDER BY '+@orderName+@sortName[/align]
[align=left] end[/align]
[align=left] else[/align]
[align=left] begin[/align]
[align=left] SET @SQLSTR =N'SELECT TOP '+STR( @PageSize )+@strGetFields+' FROM '+@tableName+' where '+@strWhere+' ORDER BY '+@orderName+@sortName[/align]
[align=left] end[/align]
[align=left] end[/align]
[align=left]ELSE IF @PageIndex = @PageCount - 1 --如果为最后一页 [/align]
[align=left] begin[/align]
[align=left] if len(@strWhere) =0[/align]
[align=left] begin[/align]
[align=left] SET @SQLSTR =N' SELECT '+@strGetFields+' FROM '+@tableName+' where '+@ID+' not in ( SELECT TOP '+STR(/*@RecordCount - */@PageSize * @PageIndex )+@ID+' FROM '+@tableName+' ORDER BY '+@orderName+@sortName+' ) ORDER BY '+@orderName+@sortName[/align]
[align=left] end[/align]
[align=left] else[/align]
[align=left] begin[/align]
[align=left] SET @SQLSTR =N' SELECT '+@strGetFields+' FROM '+@tableName+' where '+@ID+' not in ( SELECT TOP '+STR(/*@RecordCount - */ @PageSize * @PageIndex )+@ID+' FROM '+@tableName+' where '+@strWhere+' ORDER BY '+@orderName+@sortName+' ) and '+@strWhere+' ORDER BY '+@orderName+@sortName[/align]
[align=left] end[/align]
[align=left] end[/align]
[align=left]ELSE --否则执行[/align]
[align=left] begin[/align]
[align=left] if len(@strWhere) =0[/align]
[align=left] begin[/align]
[align=left] SET @SQLSTR =N' SELECT TOP '+STR( @PageSize )+@strGetFields+' FROM '+@tableName+' where '+@ID+' not in ( SELECT TOP '+STR( /*@RecordCount - */@PageSize * @PageIndex )+@ID+' FROM '+@tableName+' ORDER BY '+@orderName+@sortName+' ) ORDER BY '+@orderName+@sortName[/align]
[align=left] end[/align]
[align=left] else[/align]
[align=left] begin[/align]
[align=left] SET @SQLSTR =N' SELECT TOP '+STR( @PageSize )+@strGetFields+' FROM '+@tableName+' where '+@ID+' not in (SELECT TOP '+STR(/*@RecordCount - */ @PageSize * @PageIndex )+@ID+' FROM '+@tableName+' where '+@strWhere+' ORDER BY '+@orderName+@sortName+' )and '+@strWhere+'ORDER BY '+@orderName+@sortName[/align]
[align=left] end[/align]
[align=left] end[/align]
[align=left]EXEC (@SQLSTR)[/align]
[align=left]set nocount off[/align]
GO

在asp.net中调用方法:

#region 声明
//----------------------------------------------------------------------
//
//
// 作者: 李淼(Nick.Lee)
//
// 存储过程DataGrid分页及注意点
//
//
// boyorgril@msn.com
//
//----------------------------------------------------------------------
#endregion

private void DataGridDataBind()
{
DataSet ds = GetCustomersData(PageIndex,PageSize,ref recordCount,ref pageCount);

DataGrid1.VirtualItemCount = RecordCount;
DataGrid1.DataSource = ds;
DataGrid1.DataBind();
// GridExpand(this.DataGrid1,2);
SetPagingState();
}

private DataSet GetCustomersData(int pageIndex,int pageSize,ref int recordCount,ref int pageCount)
{
dataFill.ConString=System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"];
dataFill.sqlClientDataSet("GetCustomersDataPage");
System.Data.SqlClient.SqlDataAdapter comm=dataFill.mySqlAdapter;

comm.SelectCommand.Parameters.Add(new SqlParameter("@PageIndex",SqlDbType.Int));
comm.SelectCommand.Parameters[0].Value = pageIndex;
comm.SelectCommand.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));
comm.SelectCommand.Parameters[1].Value = pageSize;
comm.SelectCommand.Parameters.Add(new SqlParameter("@RecordCount",SqlDbType.Int));
comm.SelectCommand.Parameters[2].Direction = ParameterDirection.Output;
comm.SelectCommand.Parameters.Add(new SqlParameter("@PageCount",SqlDbType.Int));
comm.SelectCommand.Parameters[3].Direction = ParameterDirection.Output;

comm.SelectCommand.Parameters.Add(new SqlParameter("@strGetFields",SqlDbType.NVarChar));
comm.SelectCommand.Parameters[4].Value ="tOrder.orderTime as '下订单时间',tOrder.facName as '工厂',tOrder.facOrderNum as '工厂订单号',tOrder.quantity as '定单数',tOrder.realQuantity as '实际出货数',tOrder.reqTime as '要求出货时间',tOrder.repTime as '出货时间',tMaterial.matName as '材料',tMaterial.colName as '颜色',tOrder.leaveQuantity as '未出货数',tOrder.orderStatic as '全部出货',tOrder.orderDetail as '备注' ";
/*tOrder.comName as '公司',tOrder.comOrderNum as '公司订单号',*/
comm.SelectCommand.Parameters.Add(new SqlParameter("@tableName",SqlDbType.NVarChar));
comm.SelectCommand.Parameters[5].Value =" tOrder left join tStock on tOrder.stoID=tStock.stoID left join tMaterial on tStock.matID=tMaterial.matID ";
comm.SelectCommand.Parameters.Add(new SqlParameter("@ID",SqlDbType.NVarChar));
comm.SelectCommand.Parameters[6].Value =" tOrder.orderID ";
comm.SelectCommand.Parameters.Add(new SqlParameter("@orderName",SqlDbType.NVarChar));
comm.SelectCommand.Parameters[7].Value =" tMaterial.matName ";
comm.SelectCommand.Parameters.Add(new SqlParameter("@strWhere",SqlDbType.NVarChar));
comm.SelectCommand.Parameters[8].Value =" facName='"+en1.decyrpt(this.Request.QueryString["facName"].ToString())+"' and facOrderNum='"+en1.decyrpt(this.Request.QueryString["facNum"].ToString())+"' ";
// comm.Parameters.Add(new SqlParameter("@sortName",SqlDbType.NVarChar));
// comm.Parameters[8].Value =" desc ";

comm.Fill(dataFill.myDateSet);

recordCount = (int)comm.SelectCommand.Parameters[2].Value;
pageCount = (int)comm.SelectCommand.Parameters[3].Value;

if(pageIndex>=pageCount&&pageCount>0)
{
PageIndex=pageCount-1;
}
else if(pageIndex>=pageCount&&pageCount==0)
{
PageIndex=0;
}
//
return dataFill.myDateSet;

}

/// <summary>
/// 控制导航按钮或数字的状态
/// </summary>
public void SetPagingState()
{
if( PageCount <= 1 )//( RecordCount <= PageSize )//小于等于一页
{
this.Menu1.Items[0].Enabled = false;
this.Menu1.Items[1].Enabled = false;
this.Menu1.Items[2].Enabled = false;
this.Menu1.Items[3].Enabled = false;
}
else //有多页
{
if( PageIndex == 0 )//当前为第一页
{
this.Menu1.Items[0].Enabled = false;
this.Menu1.Items[1].Enabled = false;
this.Menu1.Items[2].Enabled = true;
this.Menu1.Items[3].Enabled = true;
}

else if( PageIndex == PageCount - 1 )//当前为最后页
{
this.Menu1.Items[0].Enabled = true;
this.Menu1.Items[1].Enabled = true;
this.Menu1.Items[2].Enabled = false;
this.Menu1.Items[3].Enabled = false;
}
else //中间页
{
this.Menu1.Items[0].Enabled = true;
this.Menu1.Items[1].Enabled = true;
this.Menu1.Items[2].Enabled = true;
this.Menu1.Items[3].Enabled = true;
}
}
if(RecordCount == 0)
{
lab_PageCount.Text="第页共页每页"+PageSize.ToString()+"条共"+RecordCount.ToString()+"条";
}
else
{
lab_PageCount.Text="第"+(PageIndex + 1).ToString()+"页共"+PageCount.ToString()+"页每页"+PageSize.ToString()+"条共"+RecordCount.ToString()+"条";
}
}

#endregion

//重点在数据对datagrid绑定前进行判定
if(pageIndex>=pageCount&&pageCount>0)
{
PageIndex=pageCount-1;
}
else if(pageIndex>=pageCount&&pageCount==0)
{
PageIndex=0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: