首页 运维 正文
浅述asp.net海量分页数据存储过程

 2022-10-23    313  

数据分页是Web应用程序开发中经常使用的一种技术,也是提高Web数据访问性能的主要手段。本文结合ASP.NET,详细给出了两种ASP.NET海量分页数据存储的技术。

存储过程1

浅述asp.net海量分页数据存储过程

CREATEPROCEDUREpagination 
@tblNamevarchar(255),--表名 
@strGetFieldsvarchar(1000)='*',--需要返回的列 
@fldNamevarchar(255)='',--排序的字段名 
@PageSizeint,--页尺寸 
@PageIndexint,--页码 
@doCountbit,--返回记录总数,非0值则返回 
@OrderTypebit,--设置排序类型,非0值则降序 
@strWherevarchar(1500)=''--查询条件(注意:不要加where) 
AS 
declare@strSQLvarchar(5000)--主语句 
declare@strTmpvarchar(110)--临时变量 
declare@strOrdervarchar(400)--排序类型 

if@doCount!=0 
begin 
if@strWhere!='' 
set@strSQL="selectcount(*)asTotalfrom["+@tblName+"]where"+@strWhere 
else 
set@strSQL="selectcount(*)asTotalfrom["+@tblName+"]" 
end 
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况 
else 
begin 

if@OrderType!=0 
begin 
set@strTmp="<(selectmin" 
set@strOrder="orderby["+@fldName+"]desc" 
--如果@OrderType不是0,就执行降序,这句很重要! 
end 
else 
begin 
set@strTmp=">(selectmax" 
set@strOrder="orderby["+@fldName+"]asc" 
end 

if@PageIndex=1 
begin 
if@strWhere!='' 
set@strSQL="selecttop"+str(@PageSize)+""+@strGetFields+"from["+@tblName+"]where"+@strWhere+""+@strOrder 
else 
set@strSQL="selecttop"+str(@PageSize)+""+@strGetFields+"from["+@tblName+"]"+@strOrder 
--如果是第一页就执行以上代码,这样会加快执行速度 
end 
else 
begin 
--以下代码赋予了@strSQL以真正执行的SQL代码 
set@strSQL="selecttop"+str(@PageSize)+""+@strGetFields+"from[" 
+@tblName+"]where["+@fldName+"]"+@strTmp+"(["+@fldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"["+@fldName+"]from["+@tblName+"]"+@strOrder+")astblTmp)"+@strOrder 

if@strWhere!='' 
set@strSQL="selecttop"+str(@PageSize)+""+@strGetFields+"from[" 
+@tblName+"]where["+@fldName+"]"+@strTmp+"([" 
+@fldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"[" 
+@fldName+"]from["+@tblName+"]where"+@strWhere+"" 
+@strOrder+")astblTmp)and"+@strWhere+""+@strOrder 
end 
end 
exec(@strSQL) 
GO 

调用的程序(为了通用性,我写了一个方法,大家可以提意见,也可以对其进行修改,多多交换意见,共同进步) 
privatestaticDataSetGetCustomersData(stringtblName,stringstrGetFields,stringfldName,intPageSize,intPageIndex,intdoCount,intOrderType,stringstrWhere) 
{ 
stringconnString=ConfigurationSettings.AppSettings["connstr"]; 
SqlConnectionconn=newSqlConnection(connString); 
SqlCommandcomm=newSqlCommand("pagination3",conn); 

comm.Parameters.Add(newSqlParameter("@tblName",SqlDbType.VarChar));//表名 
comm.Parameters[0].Value=tblName; 
comm.Parameters.Add(newSqlParameter("@strGetFields",SqlDbType.VarChar));//返回的列 
comm.Parameters[1].Value=strGetFields; 
comm.Parameters.Add(newSqlParameter("@fldName",SqlDbType.VarChar));//排序的字段名 
comm.Parameters[2].Value=fldName; 
comm.Parameters.Add(newSqlParameter("@PageSize",SqlDbType.Int));//页尺寸 
comm.Parameters[3].Value=PageSize; 
comm.Parameters.Add(newSqlParameter("@PageIndex",SqlDbType.Int));//页码 
comm.Parameters[4].Value=PageIndex; 
comm.Parameters.Add(newSqlParameter("@doCount",SqlDbType.Int));//是否返回记录总数,0为不返回,1为返回 
comm.Parameters[5].Value=doCount; 
comm.Parameters.Add(newSqlParameter("@OrderType",SqlDbType.Int));//设置排序类型,0为升序,非0为降序 
comm.Parameters[6].Value=OrderType; 
comm.Parameters.Add(newSqlParameter("@strWhere",SqlDbType.VarChar));//where语句 
comm.Parameters[7].Value=strWhere; 
comm.CommandType=CommandType.StoredProcedure; 
SqlDataAdapterdataAdapter=newSqlDataAdapter(comm); 
DataSetds=newDataSet(); 
dataAdapter.Fill(ds); 
returnds; 
}

存储过程2

CREATEPROCEDURE[dbo].[GetRecordFromPage] 
@SelectListVARCHAR(2000),--欲选择字段列表 
@TableSourceVARCHAR(100),--表名或视图表 
@SearchConditionVARCHAR(2000),--查询条件 
@OrderExpressionVARCHAR(1000),--排序表达式 
@PageIndexINT=1,--页号,从0开始 
@PageSizeINT=10--页尺寸 
AS 
BEGIN
IF@SelectListISNULLORLTRIM(RTRIM(@SelectList))=''
BEGIN
SET@SelectList='*'
END
PRINT@SelectList 
 
SET@SearchCondition=ISNULL(@SearchCondition,'') 
SET@SearchCondition=LTRIM(RTRIM(@SearchCondition)) 
IF@SearchCondition<>''
BEGIN
IFUPPER(SUBSTRING(@SearchCondition,1,5))<>'WHERE'
BEGIN
SET@SearchCondition='WHERE'+@SearchCondition 
END
END
PRINT@SearchCondition 

SET@OrderExpression=ISNULL(@OrderExpression,'') 
SET@OrderExpression=LTRIM(RTRIM(@OrderExpression)) 
IF@OrderExpression<>''
BEGIN
IFUPPER(SUBSTRING(@OrderExpression,1,5))<>'WHERE'
BEGIN
SET@OrderExpression='ORDERBY'+@OrderExpression 
END
END
PRINT@OrderExpression 

IF@PageIndexISNULLOR@PageIndex<1 
BEGIN
SET@PageIndex=1 
END
PRINT@PageIndex 
IF@PageSizeISNULLOR@PageSize<1 
BEGIN
SET@PageSize=10 
END
PRINT@PageSize 

DECLARE@SqlQueryVARCHAR(4000) 

SET@SqlQuery='SELECT'+@SelectList+',RowNumber 
FROM 
(SELECT'+@SelectList+',ROW_NUMBER()OVER('+@OrderExpression+')ASRowNumber 
FROM'+@TableSource+''+@SearchCondition+')ASRowNumberTableSource 
WHERERowNumberBETWEEN'+CAST(((@PageIndex-1)*@PageSize+1)ASVARCHAR) 
+'AND'+ 
CAST((@PageIndex*@PageSize)ASVARCHAR) 
--ORDERBY'+@OrderExpression 
PRINT@SqlQuery 
SETNOCOUNTON
EXECUTE(@SqlQuery) 
SETNOCOUNTOFF
 
RETURN@@RowCount 
END

原文链接:https://77isp.com/post/7043.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。