网上分页存储过程的代码很多,这个是我一直在用的经典的三层架构里提取出来的,并做了部分语句的优化...
如有更好的欢迎讨论!
set
ANSI_NULLS
ON
set
QUOTED_IDENTIFIER
ON
GO
------------------------------------
--用途:分页存储过程(对有主键的表效率极高)
--说明:(优化了部分语句)
------------------------------------
ALTER
PROCEDURE
[dbo].[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
=
'<(select
min'
set
@strOrder
=
'
order by ['
+
@fldName +
']
desc'
end
else
begin
set
@strTmp
=
'>(select
max'
set
@strOrder
=
'
order by ['
+
@fldName +
']
asc'
end
set
@strSQL
=
'select
top '
+
str(@PageSize) +
'
* from ['
+
@tblName +
']
where ['
+
@fldName +
']'
+
@strTmp +
'(['
+
@fldName +
'])
from (select top '
+
str((@PageIndex-1)*@PageSize) +
'
['
+
@fldName +
']
from ['
+
@tblName +
']'
+
@strOrder +
')
as tblTmp)'
+
@strOrder
if
@strWhere !=
''
set
@strSQL
=
'select
top '
+
str(@PageSize) +
'
* from ['
+
@tblName +
']
where ['
+
@fldName +
']'
+
@strTmp +
'(['
+
@fldName +
'])
from (select top '
+
str((@PageIndex-1)*@PageSize) +
'
['
+
@fldName +
']
from ['
+
@tblName +
']
where '
+
@strWhere +
'
'
+
@strOrder +
')
as tblTmp) and '
+
@strWhere +
'
'
+
@strOrder
if
@PageIndex = 1
begin
set
@strTmp
=
''
if
@strWhere !=
''
set
@strTmp
=
'
where '
+
@strWhere
set
@strSQL
=
'select
top '
+
str(@PageSize) +
'
* from ['
+
@tblName +
']'
+
@strTmp +
'
'
+
@strOrder
end
if
@IsReCount != 0
set
@strSQL
=
'select
count(*) as Total from ['
+
@tblName +
']'
+
'
where '
+
@strWhere
exec
(@strSQL)
以下是C#调用的接口方法
使用时注意一下命名空间改为你的,需要引用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调用示例:
private
void
DataBinder()
{
DataList1.DataSource
= GetList(
"Test"
,AspNetPager1.PageSize,
AspNetPager1.CurrentPageIndex, strWhere,
""
,
0);
DataList1.DataBind();
}
protected
void
AspNetPager1_PageChanged(
object
src,
EventArgs e)
{
DataBinder();
}
上面的是通用型的比较适用于sql2000,只支持主键排序,需要其它字段的大家可以改一下,下面的这个适用于sql 2005的通用分页排序存储过程,支持多字段排序,可以不一定要求是以主键排序
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 |