|
|
#42
ming2062006-11-10 00:40
我刚又下下来看。原来跟我原来看另外一个人的一模一样,如果我没记错的话,这个代码的源创者应该是“无根泉”。我受不了。想要分页代码。结合存储过程做是最先进的,本人整理的存储过程分页就有几个。基本都是经过本人修改过。
这里推荐一下本人做的那个代码生成器里就有这个方法,虽然代码不一样,但是思想却是一样的。本人努力了几天做了那个自动生成代码的软件。可以说操作数据库的所有方法都有。以下仅列出一个分页方法的原理。
<% ''''''''''''''''类描述''''''''''''''' '软件自动生成userInfos类所有内容 '该类名称:userInfos '生成时间:2006-11-8 上午 12:08:38 '主要作用: ''''''''''''''''''''''''''''''''''''' '类代码开始 Class userInfos
'List():返回带记录集数据,当返回一条记录时,其重定义为一维数组,当返回多条记录时,例如分页返回记录集,重定义为二维数组 'Row_N:字段个数,Col_N:某当前页产生的记录数,Counts:产生的总页数 Public List(), Row_N, Col_N,Counts '构造,初始化 Private sub class_initialize() '类初始器内根据需要可自行添加 End sub '销毁资源 Private sub class_terminate() '资源释放根据需要可自行添加 End sub '私有数据成员
Private Address Private CompanyAddress '更多代码不贴了。
''''''''''''''''''''''''''''''''''''''''''''''' '软件自动生成该方法 '方法名:getList '作 用:返回当前页的记录集 '参 数:Fields_N,字段串 '参 数:Page_N,传递过来的当前页号 '参 数:Where_str,SQL语句的Where条,不需要带Where关键字,如果为空。则不连Where条件 '参 数:SortTy,确定数据库聚集,一般取ID自动编号 '参 数:OrderBy_S,排列顺序,可以自己选择:ASC或DESC '' ''''''''''''''''''''''''''''''''''''''''''''''' Public Sub getList(Fields_N, Page_N, PageCount_N,SortTy,Where_S,OrderBy_S) '局部变量说明: 'SQL:SQL字符串 'Rs:Recordset对象 'SQL:SQL字符串 'AllCounts:获得数据库中总的记录集 Dim SQL, Rs, AllCounts Set Rs = Server.CreateObject("ADODB.Recordset") 'SQL字符串,目的是取得总记录集 SQL = "Select Count(*) AS Cn From [UserInfo_Table] " '判断SQL语句的条件部分是否为空 If (Where_S <> "") Then SQL=SQL&" Where " & Where_S End If '取得总记录集 AllCounts = conn.Execute(SQL).Fields(0) '取得页数 '先用除法取整 Counts = CInt(AllCounts / PageCount_N) '判断是否有余数 If (AllCounts Mod PageCount_N) <> 0 Then '存在余数则页数+1 Counts = Counts + 1 End If '当页号大于1时候设置为1 If (CInt(Page_N) < 1) Then Page_N = 1 '当页号大于总页数,设置为最后一页 If (CInt(Page_N) >= Counts) Then Page_N = Counts '先判断是否为1,也就是小于2 If (CInt(Page_N) <= 1) Then '如果是第一页,则直接取得前PageCount_N条记录 SQL = "SELECT TOP " & PageCount_N & Fields_N &"From [UserInfo_Table] ORDER BY "& OrderBy_S Else '否则,按以下规则进行过滤抽出记录集 SQL = "SELECT TOP " & PageCount_N & Fields_N SQL=SQL&" FROM [UserInfo_Table] WHERE ("&SortTy&" NOT In (SELECT TOP " & ((CInt(PageCount_N))) * CInt(Page_N - 1) & ""&SortTy&" FROM [UserInfo_Table] ORDER BY "&OrderBy_S&" ))" SQL=SQL&" ORDER BY "&OrderBy_S End If '打开数据库取当前页号的记录集 Rs.Open SQL, conn, 1, 1 '取得字段个数 Row_N = Rs.Fields.Count - 1 '取得当前记录的条数 Col_N = Rs.RecordCount - 1 '重定义二维数组 ReDim List(Row_N, Col_N) '判断存在,循环输入数组 If Not Rs.EOF Then '循环取出行记录 For i = 0 To Col_N '如果到尾,跳出循环 If Rs.EOF Then Exit For '循环取出字段 For j = 0 To Row_N List(j, i) = Rs.Fields(j) Next '移动到下一条记录 Rs.MoveNext Next End If '关闭 Rs.Close Set Rs = Nothing End Sub End Class %>
另外发几个利用PL/SQL编写的存储过程分页功能。调用我就不说了。 这两个绝对没有假,直接从我SQLSERVER里调试好弄出来的。
1.
CREATE PROCEDURE ShowPage_Proc ( --参数列表 @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 --如果@doCount传递过来的不是0,就执行总数统计。 begin set @strSQL = "select count(*) as Total from [" + @tblName + "]" if @strWhere !="" --如果查询条件不为空,则加上Where条件语句 set @strSQL= @strSQL +" where "+@strWhere end else --以下的所有代码都是@doCount为0的情况 begin if @OrderType != 0 --如果@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 --如果启始页码为1 if @PageIndex = 1 begin --如果查询条件不为空,则加上where条件 if @strWhere != "" set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder else --反之不加where条件 set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder end --启始页码非1开始 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 + "] where " + @strWhere + " " + @strOrder --如果查询条件不为空,则加上where条件 if @strWhere != "" set @strSQL = @strSQL+ ") as tblTmp) and " + @strWhere + " " + @strOrder end end exec (@strSQL) GO
2.
/* 函数名称: GetRecordFromPage 函数功能: 获取指定页的数据 参数说明: @tblName 包含数据的表名 @fldName 关键字段名 @PageSize 每页记录数 @PageIndex 要获取的页码 @IsCount 是否要取得记录数 @OrderType 排序类型, 0 - 升序, 1 - 降序 @strWhere 查询条件 (注意: 不要加 where) */ CREATE PROCEDURE pGO_GetRecordFromPage @tblName varchar(255), -- 表名 @fldName varchar(255), -- 字段名 @PageSize int = 10, -- 页尺寸 @PageIndex int = 1, -- 页码 @IsCount bit = 0, -- 返回记录总数, 非 0 值则返回 @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 @strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where) AS
declare @strSQL varchar(6000) -- 主语句 declare @strTmp varchar(500) -- 临时变量 declare @strOrder varchar(400) -- 排序类型
-- 如果是查询记录总数,直接使用Count(0)函数 if @IsCount != 0 begin if @strWhere != '' set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere else set @strSQL = 'select count(*) as Total from [' + @tblName + '] ' end --如果是想查询记录,则 else begin if @PageIndex = 1 begin set @strTmp = '' if @strWhere != '' set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + ' * from [' + @tblName + ']' + @strTmp + ' ' + @strOrder end else begin --如果是降序查询…… 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
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 else 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
end end
exec (@strSQL) GO
|