ASP开发中存储过程应用全接触(3)

2008-02-23 05:34:22来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

next

Set MyComm = Nothing

  通过以上代码可以看出:重复调用同一存储过程时,只需为值发生改变的输入参数重新赋值即可,这一方法在有多个输入输出参数,且每次调用时只有一个输入参数的值发生变化时,可以大大减少代码量。

5. 同时具有返回值、输入参数、输出参数的存储过程

  前面说过,在调用存储过程时,声明参数的顺序要与存储过程中定义的顺序相同。还有一点要特别注意:如果存储过程同时具有返回值以及输入、输出参数,返回值要最先声明。

  为了演示这种情况下的调用方法,我们改善一下上面的例子。还是取得ID为1的用户的用户名,但是有可能该用户不存在(该用户已删除,而userid是自增长的字段)。存储过程根据用户存在与否,返回不同的值。此时,存储过程和ASP代码如下:

/*SP5*/

CREATE PROCEDURE dbo.getUserName

--为了加深对"顺序"的印象,将以下两参数的定义顺序颠倒一下

@UserName varchar(40) output,

@UserID int

as

set nocount on

begin

if @UserID is null return

select @UserName=username

from dbo.[userinfo]

where userid=@UserID

if rowcount> 0

return 1

else

return 0

return

end

go

'**调用同时具有返回值、输入参数、输出参数的存储过程**

DIM MyComm,UserID,UserName

UserID = 1

Set MyComm = Server.CreateObject("ADODB.Command")

with MyComm

.ActiveConnection = MyConStr 'MyConStr是数据库连接字串

.CommandText = "getUserName" '指定存储过程名

.CommandType = 4 '表明这是一个存储过程

.Prepared = true '要求将SQL命令先行编译

'返回值要最先被声明

.Parameters.Append .CreateParameter("RETURN",2,4)

'以下两参数的声明顺序也做相应颠倒

.Parameters.append .CreateParameter("@UserName",200,2,40)

.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)

.Execute

end with

if MyComm(0) = 1 then

UserName = MyComm(1)

else

UserName = "该用户不存在"

end if

Set MyComm = Nothing

  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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:asp网页提升速度方法5则

下一篇:ASP开发中存储过程应用详解