ASP程序与SQL存储过程结合使用详解(6)
来源:asp之家 发布时间:2011-03-25 10:50:00
6. 同时返回参数和记录集的存储进程
有时候,我们需要存储进程同时返回参数和记录集,比如在利用存储进程分页时,要同时返回记录集以及数据总量等参数。以下给出一个进行分页处理的存储进程:
/*SP6*/
CREATE PROCEDURE DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --总页数
@IPAGE INT, --当前页号
@IPAGESIZE INT --每页记录数
AS
SET NOCOUNT ON
BEGIN
--创建临时表
CREATE TABLE #T (ID INT IDENTITY, --自增字段
USERID INT,
USERNAME VARCHAR(40))
--向临时表中写入数据
INSERT INTO #T
SELECT USERID,USERNAME FROM DBO.[USERINFO]
ORDER BY USERID
--取得记录总数
DECLARE @IRECORDCOUNT INT
SET @IRECORDCOUNT = @@ROWCOUNT
--确定总页数
IF @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
ELSE
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
--若请求的页号大于总页数,则显示最后一页
IF @IPAGE > @IPAGECOUNT
SELECT @IPAGE = @IPAGECOUNT
--确定当前页的始末记录
DECLARE @ISTART INT --START RECORD
DECLARE @IEND INT --END RECORD
SELECT @ISTART = (@IPAGE - 1) * @IPAGESIZE
SELECT @IEND = @ISTART + @IPAGESIZE + 1
--取当前页记录
SELECT * FROM #T WHERE ID>@ISTART AND ID<@IEND
--删除临时表
DROP TABLE #T
--返回记录总数
RETURN @IRECORDCOUNT
END
GO
在上面的存储进程中,输入当前页号及每页记录数,返回当前页的记录集,总页数及记录总数。为了更具典型性,将记录总数以返回值的形式返回。以下是调用该存储进程的ASP代码(具体的分页操作略去):
'**调用分页存储进程**
DIM PAGENOW,PAGESIZE,PAGECOUNT,RECORDCOUNT
DIM MYCOMM,MYRST
PAGENOW = REQUEST("PN")
'自定义函数用于验证自然数
IF CHECKNAR(PAGENOW) = FALSE THEN PAGENOW = 1
PAGESIZE = 20
SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
WITH MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR是数据库连接字串
.COMMANDTEXT = "GETUSERLIST" '指定存储进程名
.COMMANDTYPE = 4 '表明这是一个存储进程
.PREPARED = TRUE '要求将SQL命令先行编译
'返回值(记录总量)
.PARAMETERS.APPEND .CREATEPARAMETER("RETURN",2,4)
'出参(总页数)
.PARAMETERS.APPEND .CREATEPARAMETER("@IPAGECOUNT",3,2)
'入参(当前页号)
.PARAMETERS.APPEND .CREATEPARAMETER("@IPAGE",3,1,4,PAGENOW)
'入参(每页记录数)
.PARAMETERS.APPEND .CREATEPARAMETER("@IPAGESIZE",3,1,4,PAGESIZE)
SET MYRST = .EXECUTE
END WITH
IF MYRST.STATE = 0 THEN '未取到数据,MYRST关闭
RECORDCOUNT = -1
ELSE
MYRST.CLOSE '注意:若要取得参数值,需先关闭记录集对象
RECORDCOUNT = MYCOMM(0)
PAGECOUNT = MYCOMM(1)
IF CINT(PAGENOW)>=CINT(PAGECOUNT) THEN PAGENOW=PAGECOUNT
END IF
SET MYCOMM = NOTHING
'以下显示记录
IF RECORDCOUNT = 0 THEN
RESPONSE.WRITE "无记录"
ELSEIF RECORDCOUNT > 0 THEN
MYRST.OPEN
DO UNTIL MYRST.EOF
......
LOOP
'以下显示分页信息
......
ELSE 'RECORDCOUNT=-1
RESPONSE.WRITE "参数错误"
END IF
对于以上代码,只有一点需要说明:同时返回记录集和参数时,若要取得参数,需先将记录集关闭,使用记录集时再将其打开。


猜你喜欢
- 笔者今天就谈谈自己对这两种操作模式的理解,并且给出一些可行的建议,跟大家一起来提高Oracle数据库的安全性。 一、非归档模式的利与弊。 非
- 总说由于pytorch 0.4版本更新实在太大了, 以前版本的代码必须有一定程度的更新. 主要的更新在于 Variable和Tensor的合
- 前言这期文章我就为大家介绍关于python的艺术美——画图神器在数学中有一种美,叫几何美,我们又称为
- 决策树之ID3算法及其Python实现,具体内容如下主要内容决策树背景知识决策树一般构建过程ID3算法分裂属性的选择ID3算法流程及其优缺点
- fab命令好似结合我们编写的fabfile.py(其它文件名必须添加-f filename应用)来搭配使用的,部分命令行参数可以通过相应的方
- 目的: 从数据库读取二进制位图图形数据资料, 透过 ImageMagickObject 组件即时制作缩略图,并显示在网页上 (ge
- 前端的很多静态资源,比如JS,CSS怎么办呢?这时,我们需要一个公共且高速的静态资源托管平台。这里就推荐百度静态资源公共库,百度静态资源公共
- 抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢?最近都在做原生JS熟悉的练习。。。用原生Js封装了一个Ajax插件,引入一般的项
- 针对这种情况,人工智能自动SQL优化工具应运而生。现在我就向大家介绍这样一款工具:SQLTuning for SQL Server。1. S
- 前言生成器generator生成器的本质是一个迭代器(iterator)要理解生成器,就要在理解一下迭代,可迭代对象,迭代器,这三个概念Py
- max() 方法返回其参数最大值:最接近正无穷大的值。语法以下是max()方法的语法:max( x, y, z, .... )参
- 1.前言版本:Python3.6.1 + PyQt5写一个程序的时候需要用到画板/手写板,只需要最简单的那种。原以为网上到处都是,结果找了好
- coalesce 函数可以接受多个参数,将会返回这些参数中第一个非NULL的值,若提供的参数全部为NULL,则返回NULLifnull 函数
- Python 作为当前最热门的编程语言之一,不仅仅是因为它的学习成本低、入门容易,还因为它具有丰富的生态环境,包括内置的模块以及第三方的库,
- 这篇文章主要介绍了python通过移动端访问查看电脑界面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- $attrs和inheritAttrs用法$attrs属性解释:包含了父作用域中不作为组件 props 或自定义事件的 attribute
- 目录一 项目描述1.1 背景1.2 实现设计1.2.1 之前的方法1.2.2 优化后的方法二.实现详情2.1 编辑Python可执行文件2.
- 一、需求描述手上有大量外文文档(本案例以5份为例,分别命名为 test1.docx test2.docx 以此
- 新版本的selenium已经明确警告将不支持PhantomJS,建议使用headless的Chrome或FireFox。两者使用方式非常类似
- 首先忠心感谢凌宇5942给我的帮助!在他的启迪下我发现了另一种实现flash透明背景的办法,愿与大家共同探讨:凌宇5942告知的解决办法:在