|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)server|sql|存储历程|分页Sqlserver存储历程和C#分页类简化你的代码!
在比来的项目中,因为要用到自界说分页的功效,自己就在网上找了个存储历程。分离C#写了个分页类。因为自己第一次写文章。写得欠好,人人不要扔鸡蛋。。
上面是存储历程(sqlserver2000下经由过程)
--最通用的分页存储历程
--猎取指定页的数据
CREATEPROCEDUREPagination
@tblNamevarchar(255),--表名
@strGetFieldsvarchar(1000)=*,--必要前往的列
@fldNamevarchar(255)=,--排序的字段名
@PageSizeint=10,--页尺寸
@PageIndexint=1,--页码
@doCountbit=0,--前往纪录总数,非0值则前往
@OrderTypebit=0,--设置排序范例,非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
上面是C#的代码
usingSystem.Data;
usingSystem.Data.SqlClient;
usingMicrosoft.ApplicationBlocks.Data;
usingSystem.Web;
usingSystem.Web.UI;
namespaceRssLayer.PageHelper
{
/**////<summary>
///分页类PagerHelper的择要申明。
///</summary>
publicclassPagerHelper
{
privatestringconnectionString;
publicPagerHelper(stringtblname,stringsortname,booldocount,stringconnectionString)
{
this.tblName=tblname;
this.fldName=sortname;
this.connectionString=connectionString;
this.docount=docount;
}
publicPagerHelper(stringtblname,booldocount,
stringstrGetFields,stringfldName,intpagesize,
intpageindex,boolordertype,stringstrwhere,stringconnectionString
)
{
this.tblName=tblname;
this.docount=docount;
this.strGetFields=strGetFields;
this.fldName=fldName;
this.pagesize=pagesize;
this.pageindex=pageindex;
this.ordertype=ordertype;
this.strwhere=strwhere;
this.connectionString=connectionString;
}
/**////<summary>
///失掉纪录集的机关函数
///</summary>
///<paramname="tblname"></param>
///<paramname="strwhere"></param>
///<paramname="connectionString"></param>
publicPagerHelper(stringtblname,stringstrwhere,stringconnectionString)
{
this.tblName=tblname;
this.strwhere=strwhere;
this.docount=true;
this.connectionString=connectionString;
}
privatestringtblName;
publicstringTblName
{
get{returntblName;}
set{tblName=value;}
}
privatestringstrGetFields="*";
publicstringStrGetFields
{
get{returnstrGetFields;}
set{strGetFields=value;}
}
privatestringfldName=string.Empty;
publicstringFldName
{
get{returnfldName;}
set{fldName=value;}
}
privateintpagesize=10;
publicintPageSize
{
get{returnpagesize;}
set{pagesize=value;}
}
privateintpageindex=1;
publicintPageIndex
{
get{returnpageindex;}
set{pageindex=value;}
}
privatebooldocount=false;
publicboolDoCount
{
get{returndocount;}
set{docount=value;}
}
privateboolordertype=false;
publicboolOrderType
{
get{returnordertype;}
set{ordertype=value;}
}
privatestringstrwhere=string.Empty;
publicstringStrWhere
{
get{returnstrwhere;}
set{strwhere=value;}
}
publicIDataReaderGetDataReader()
{
if(this.docount)
{
thrownewArgumentException("要前往纪录集,DoCount属性必定为false");
}
//System.Web.HttpContext.Current.Response.Write(pageindex);
returnSqlHelper.ExecuteReader(connectionString,CommandType.StoredProcedure,"Pagination",
newSqlParameter("@tblName",this.tblName),
newSqlParameter("@strGetFields",this.strGetFields),
newSqlParameter("@fldName",this.fldName),
newSqlParameter("@PageSize",this.pagesize),
newSqlParameter("@PageIndex",this.pageindex),
newSqlParameter("@doCount",this.docount),
newSqlParameter("@OrderType",this.ordertype),
newSqlParameter("@strWhere",this.strwhere)
);
}
publicDataSetGetDataSet()
{
if(this.docount)
{
thrownewArgumentException("要前往纪录集,DoCount属性必定为false");
}
returnSqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure,"Pagination",
newSqlParameter("@tblName",this.tblName),
newSqlParameter("@strGetFields",this.strGetFields),
newSqlParameter("@fldName",this.fldName),
newSqlParameter("@PageSize",this.pagesize),
newSqlParameter("@PageIndex",this.pageindex),
newSqlParameter("@doCount",this.docount),
newSqlParameter("@OrderType",this.ordertype),
newSqlParameter("@strWhere",this.strwhere)
);
}
publicintGetCount()
{
if(!this.docount)
{
thrownewArgumentException("要前往总数统计,DoCount属性必定为true");
}
return(int)SqlHelper.ExecuteScalar(connectionString,CommandType.StoredProcedure,"Pagination",
newSqlParameter("@tblName",this.tblName),
newSqlParameter("@strGetFields",this.strGetFields),
newSqlParameter("@fldName",this.fldName),
newSqlParameter("@PageSize",this.pagesize),
newSqlParameter("@PageIndex",this.pageindex),
newSqlParameter("@doCount",this.docount),
newSqlParameter("@OrderType",this.ordertype),
newSqlParameter("@strWhere",this.strwhere)
);
}
}
}
怎样挪用???
假设我已创建了2个类。一个是FavList数据库实体类,一个FavListCollection汇合类。FavListCollection存储了FavList实体类的汇合。
我能够如许写一个办法。
/**////<summary>
///前往FavList汇合,利用存储历程自界说分页。
///</summary>
///<paramname="userid">数据库FavList的字段,用户ID</param>
///<paramname="strwhere">查找的前提</param>
///<paramname="ordertype">排序,true暗示Desc,false暗示asc</param>
///<paramname="fldname">排序的字段,只能是一个字段</param>
///<paramname="pagesize">每页的纪录数</param>
///<paramname="pageindex">到第几页的参数,由1入手下手。1暗示第一页,以此类推。</param>
///<paramname="recordcount">总纪录数。</param>
///<returns></returns>
publicoverrideFavListCollectionGetFavListsByUser(intuserid,stringstrwhere,
boolordertype,stringfldname,intpagesize,
intpageindex,outintrecordcount
)
{
recordcount=0;
PagerHelperhelper=newPagerHelper("Vfavlist",strwhere,ConnectionString);//VFavList是View
recordcount=helper.GetCount();
PagerHelperhelper2=newPagerHelper("Vfavlist",false,"*",fldname,
pagesize,pageindex,ordertype,strwhere,ConnectionString);
IDataReaderdr=helper2.GetDataReader();
FavListCollectionlist=newFavListCollection();
while(dr.Read())
{
list.Add(PopulateFavList(dr));
}
dr.Close();
returnlist;
}
DataGrid挪用就不必说了吧。。
关于该分页的Bug和范围性
Bug:当排序谁人字段内容不异的时分(比方:定时间来排序,而工夫是一样的话。前面的纪录会显现不出来。自己测试过)
范围性:排序只能一个字段,不克不及凌驾一个
出处:BLOG永不言拜
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 |
|