Sqlserver存储过程和C#分页类简化你的代码!
2008-01-16 17:22
513 查看
在最近的项目中,由于要用到自定义分页的功能,本人就在网上找了个存储过程。结合C#写了个分页类。由于本人第一次写文章。写得不好,大家不要扔鸡蛋。。
下面是存储过程(sqlserver2000下通过)
--最通用的分页存储过程
-- 获取指定页的数据
CREATE PROCEDURE Pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from ['+ @tblName +'] where '+ @strWhere
else
set @strSQL = 'select count(*) as Total from ['+ @tblName +']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都
--是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ['+ @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ['+ @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName +'] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName +'] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' 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) +' '+@strGetFields+ ' from ['+ @tblName +'] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + ']
from ['+ @tblName +'] where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec ( @strSQL)
GO
下面是C#的代码
using System.Data ;
using System.Data.SqlClient ;
using Microsoft.ApplicationBlocks.Data ;
using System.Web ;
using System.Web.UI ;
namespace RssLayer.PageHelper
如何调用???
假如我已经建立了2个类。一个是FavList数据库实体类,一个FavListCollection集合类。FavListCollection存储了FavList实体类的集合。
我可以这样写一个方法。
public override FavListCollection GetFavListsByUser(int userid, string strwhere,
bool ordertype, string fldname, int pagesize,
int pageindex,out int recordcount
)
{
{
list.Add(PopulateFavList(dr));
}
dr.Close();
return list;
}
DataGrid调用就不用说了吧。。
关于该分页的Bug和局限性
Bug:当排序那个字段内容相同的时候(例如:按时间来排序,而时间是一样的话。后面的记录会显示不出来。本人测试过)
局限性:排序只能一个字段,不能超过一个
如有问题:可以回帖
下面是存储过程(sqlserver2000下通过)
--最通用的分页存储过程
-- 获取指定页的数据
CREATE PROCEDURE Pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from ['+ @tblName +'] where '+ @strWhere
else
set @strSQL = 'select count(*) as Total from ['+ @tblName +']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都
--是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ['+ @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ['+ @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName +'] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName +'] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' 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) +' '+@strGetFields+ ' from ['+ @tblName +'] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + ']
from ['+ @tblName +'] where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec ( @strSQL)
GO
下面是C#的代码
using System.Data ;
using System.Data.SqlClient ;
using Microsoft.ApplicationBlocks.Data ;
using System.Web ;
using System.Web.UI ;
namespace RssLayer.PageHelper
如何调用???
假如我已经建立了2个类。一个是FavList数据库实体类,一个FavListCollection集合类。FavListCollection存储了FavList实体类的集合。
我可以这样写一个方法。
public override FavListCollection GetFavListsByUser(int userid, string strwhere,
bool ordertype, string fldname, int pagesize,
int pageindex,out int recordcount
)
{
{
list.Add(PopulateFavList(dr));
}
dr.Close();
return list;
}
DataGrid调用就不用说了吧。。
关于该分页的Bug和局限性
Bug:当排序那个字段内容相同的时候(例如:按时间来排序,而时间是一样的话。后面的记录会显示不出来。本人测试过)
局限性:排序只能一个字段,不能超过一个
如有问题:可以回帖
相关文章推荐
- Sqlserver存储过程和C#分页类简化你的代码!
- Sqlserver存储过程和C#分页类简化你的代码!
- Sqlserver存储过程和C#分页类简化你的代码!
- Sqlserver存储过程和C#分页类简化你的代码![转]
- Sqlserver存储过程和C#分页类简化你的代码
- Sqlserver存储过程和C#分页类简化你的代码!
- Sql server存储过程和C#分页类简化你的代码
- 编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现
- 让C#委托来帮你简化代码,学习使用Func、Action委托
- sql2000数据库 sql语句C#分页类代码
- 需要这样一个记事本-16 DotNet C# 匿名委托简化代码
- 超精简C#程序代码改进-利用扩展方法简化代码增强可读性
- 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用
- 超精简C#程序代码改进-利用扩展方法简化代码增强可读性
- 让 C# 委托来帮你简化代码,学习使用 Func、Action 委托
- 编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为
- 实战(代码)练习 C# 多线程
- C# 半全角字符相转换代码
- WPF DevExpress Chart控件 界面绑定数据源,不通过C#代码进行绑定
- 对“C#写的简单的日历,窗体输出。”的改写,精简了一半多代码