ASP基础之存储过程应用全接触(下)

开发 后端
本文详细介绍ASP开发中的存储过程,由于文章比较长,分为两篇为大家介绍,希望对你有帮助,一起来看。

ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。接上篇>>

为了方便说明,根据存储过程的输入输出,作以下简单分类:

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

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

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

  1. *SP5*/   
  2. CREATE PROCEDURE dbo.getUserName   
  3. --为了加深对"顺序"的印象,将以下两参数的定义顺序颠倒一下   
  4. @UserName varchar(40) output,   
  5. @UserID int   
  6. as   
  7. set nocount on   
  8. begin   
  9. if @UserID is null return   
  10. select @UserName=username   
  11. from dbo.[userinfo]   
  12. where userid=@UserID   
  13. if rowcount> 0   
  14. return 1   
  15. else   
  16. return 0   
  17. return   
  18. end   
  19. go  

 

 

  1. '**调用同时具有返回值、输入参数、输出参数的存储过程**   
  2. DIM MyComm,UserID,UserName   
  3. UserID = 1   
  4. Set MyComm = Server.CreateObject("ADODB.Command")   
  5. with MyComm   
  6. .ActiveConnection = MyConStr 'MyConStr是数据库连接字串   
  7. .CommandText = "getUserName" '指定存储过程名   
  8. .CommandType = 4 '表明这是一个存储过程   
  9. .Prepared = true '要求将SQL命令先行编译   
  10. '返回值要最先被声明   
  11. .Parameters.Append .CreateParameter("RETURN",2,4)   
  12. '以下两参数的声明顺序也做相应颠倒   
  13. .Parameters.append .CreateParameter("@UserName",200,2,40)   
  14. .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)   
  15. .Execute   
  16. end with   
  17. if MyComm(0) = 1 then   
  18. UserName = MyComm(1)   
  19. else   
  20. UserName = "该用户不存在"   
  21. end if   
  22. Set MyComm = Nothing  

 

6. 同时返回参数和记录集的存储过程

有时候,我们需要存储过程同时返回参数和记录集,比如在利用存储过程分页时,要同时返回记录集以及数据总量等参数。以下给出一个进行分页处理的存储过程:

 

  1. /*SP6*/   
  2. CREATE PROCEDURE dbo.getUserList   
  3. @iPageCount int OUTPUT--总页数   
  4. @iPage int--当前页号   
  5. @iPageSize int --每页记录数   
  6. as   
  7. set nocount on   
  8. begin   
  9. --创建临时表   
  10. create table #t (ID int IDENTITY, --自增字段   
  11. userid int,   
  12. username varchar(40))   
  13. --向临时表中写入数据   
  14. insert into #t   
  15. select userid,username from dbo.[UserInfo]   
  16. order by userid   
  17. --取得记录总数   
  18. declare @iRecordCount int   
  19. set @iRecordCount = rowcount   
  20. --确定总页数   
  21. IF @iRecordCount%@iPageSize=0   
  22. SET @iPageCount=CEILING(@iRecordCount/@iPageSize)   
  23. ELSE   
  24. SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1   
  25. --若请求的页号大于总页数,则显示最后一页   
  26. IF @iPage > @iPageCount   
  27. SELECT @iPage = @iPageCount   
  28. --确定当前页的始末记录   
  29. DECLARE @iStart int --start record   
  30. DECLARE @iEnd int --end record   
  31. SELECT @iStart = (@iPage - 1) * @iPageSize   
  32. SELECT @iEnd = @iStart + @iPageSize + 1   
  33. --取当前页记录   
  34. select * from #t where ID> @iStart and ID <@iEnd   
  35. --删除临时表   
  36. DROP TABLE #t   
  37. --返回记录总数   
  38. return @iRecordCount   
  39. end   
  40. go  

 

在上面的存储过程中,输入当前页号及每页记录数,返回当前页的记录集,总页数及记录总数。为了更具典型性,将记录总数以返回值的形式返回。以下是调用该存储过程的ASP代码(具体的分页操作略去):

 

  1. '**调用分页存储过程**   
  2. DIM pagenow,pagesize,pagecount,recordcount   
  3. DIM MyComm,MyRst   
  4. pagenow = Request("pn")   
  5. '自定义函数用于验证自然数   
  6. if CheckNar(pagenow) = false then pagenow = 1   
  7. pagesize = 20   
  8. Set MyComm = Server.CreateObject("ADODB.Command")   
  9. with MyComm   
  10. .ActiveConnection = MyConStr 'MyConStr是数据库连接字串   
  11. .CommandText = "getUserList" '指定存储过程名   
  12. .CommandType = 4 '表明这是一个存储过程   
  13. .Prepared = true '要求将SQL命令先行编译 '返回值(记录总量)   
  14. .Parameters.Append .CreateParameter("RETURN",2,4)   
  15. '出参(总页数)   
  16. .Parameters.Append .CreateParameter("@iPageCount",3,2)   
  17. '入参(当前页号)   
  18. .Parameters.append .CreateParameter("@iPage",3,1,4,pagenow)   
  19. '入参(每页记录数)   
  20. .Parameters.append .CreateParameter("@iPageSize",3,1,4,pagesize)   
  21. Set MyRst = .Execute   
  22. end with   
  23. if MyRst.state = 0 then '未取到数据,MyRst关闭   
  24. recordcount = -1   
  25. else   
  26. MyRst.close '注意:若要取得参数值,需先关闭记录集对象   
  27. recordcount = MyComm(0)   
  28. pagecount = MyComm(1)   
  29. if cint(pagenow)> =cint(pagecount) then pagenow=pagecount   
  30. end if   
  31. Set MyComm = Nothing   
  32. '以下显示记录   
  33. if recordcount = 0 then   
  34. Response.Write "无记录"   
  35. elseif recordcount > 0 then   
  36. MyRst.open   
  37. do until MyRst.EOF   
  38. ......   
  39. loop   
  40. '以下显示分页信息   
  41. ......   
  42. else 'recordcount=-1   
  43. Response.Write "参数错误"   
  44. end if  

 

对于以上代码,只有一点需要说明:同时返回记录集和参数时,若要取得参数,需先将记录集关闭,使用记录集时再将其打开。

7. 返回多个记录集的存储过程

本文最先介绍的是返回记录集的存储过程。有时候,需要一个存储过程返回多个记录集,在ASP中,如何同时取得这些记录集呢?为了说明这一问题,在userinfo表中增加两个字段:usertel及usermail,并设定只有登录用户可以查看这两项内容。

 

  1. /*SP7*/  
  2.  CREATE PROCEDURE dbo.getUserInfo   
  3. @userid int,   
  4. @checklogin bit   
  5. as   
  6. set nocount on   
  7. begin   
  8. if @userid is null or @checklogin is null return   
  9. select username   
  10. from dbo.[usrinfo]   
  11. where userid=@userid   
  12. --若为登录用户,取usertel及usermail   
  13. if @checklogin=1   
  14. select usertel,usermail   
  15. from dbo.[userinfo]   
  16. where userid=@userid   
  17. return   
  18. end   
  19. go  

 

以下是ASP代码:

 

  1. '**调用返回多个记录集的存储过程**   
  2. DIM checklg,UserID,UserName,UserTel,UserMail   
  3. DIM MyComm,MyRst   
  4. UserID = 1   
  5. 'checklogin()为自定义函数,判断访问者是否登录   
  6. checklg = checklogin()   
  7. Set MyComm = Server.CreateObject("ADODB.Command")   
  8. with MyComm   
  9.  .ActiveConnection = MyConStr 'MyConStr是数据库连接字串   
  10.  .CommandText = "getUserInfo" '指定存储过程名   
  11.  .CommandType = 4 '表明这是一个存储过程   
  12.  .Prepared = true '要求将SQL命令先行编译   
  13.  .Parameters.append .CreateParameter("@userid",3,1,4,UserID)   
  14.  .Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)   
  15.  Set MyRst = .Execute   
  16. end with   
  17. Set MyComm = Nothing   
  18. '从第一个记录集中取值   
  19. UserName = MyRst(0)   
  20. '从第二个记录集中取值   
  21. if not MyRst is Nothing then   
  22.  Set MyRst = MyRst.NextRecordset()   
  23.  UserTel = MyRst(0)   
  24.  UserMail = MyRst(1)   
  25. end if   
  26. Set MyRst = Nothing  

 

以上代码中,利用Recordset对象的NextRecordset方法,取得了存储过程返回的多个记录集。

至此,针对ASP调用存储过程的各种情况,本文已做了较为全面的说明。最后说一下在一个ASP程序中,调用多个存储过程的不同方法。

在一个ASP程序中,调用多个存储过程至少有以下三种方法是可行的:

1. 创建多个Command对象

 

  1. DIM MyComm   
  2. Set MyComm = Server.CreateObject("ADODB.Command")   
  3. '调用存储过程一   
  4. ......   
  5. Set MyComm = Nothing   
  6. Set MyComm = Server.CreateObject("ADODB.Command")   
  7. '调用存储过程二   
  8. ......   
  9. Set MyComm = Nothing   
  10. ......  

 

2. 只创建一个Command对象,结束一次调用时,清除其参数

 

  1. DIM MyComm   
  2. Set MyComm = Server.CreateObject("ADODB.Command")   
  3. '调用存储过程一   
  4. .....   
  5. '清除参数(假设有三个参数)   
  6. MyComm.Parameters.delete 2   
  7. MyComm.Parameters.delete 1   
  8. MyComm.Parameters.delete 0   
  9. '调用存储过程二并清除参数   
  10. ......   
  11. Set MyComm = Nothing  

 

此时要注意:清除参数的顺序与参数声明的顺序相反,原因嘛,我也不知道。

3. 利用Parameters数据集合的Refresh方法重置Parameter对象

 

  1. DIM MyComm   
  2. Set MyComm = Server.CreateObject("ADODB.Command")   
  3. '调用存储过程一   
  4. .....   
  5. '重置Parameters数据集合中包含的所有Parameter对象   
  6. MyComm.Parameters.Refresh   
  7. '调用存储过程二   
  8. .....   
  9. Set MyComm = Nothing  

 

一般认为,重复创建对象是效率较低的一种方法,但是经测试(测试工具为Microsoft Application Center Test),结果出人意料:

方法2 > = 方法1 > > 方法3

方法2的运行速度大于等于方法1(最多可高4%左右),这两种方法的运行速度远大于方法3(最多竟高达130%),所以建议在参数多时,采用方法1,在参数较少时,采用方法2。

到这,关于ASP开发过程中的存储过程,就给大家介绍完了。希望对你有帮助。

【编辑推荐】

  1. ASP.NET网站性能优化 需要考虑哪些方面
  2. asp.net开源CMS汇总
  3. ASP.NET站点 应该从哪些方面优化
  4. 简单介绍Asp.net网站的性能优化
  5. ASP.NET新手对于技术上不要有这样的认识误区
责任编辑:于铁 来源: 互联网
相关推荐

2011-07-06 15:33:02

ASP

2010-07-02 11:00:53

GSMP协议

2020-08-21 07:00:00

DevOpsIT开发

2009-03-23 10:01:59

LinuxUbuntu 9.04试用

2020-10-21 09:00:15

Azure Sprin云服务日志

2012-10-10 09:12:54

Windows Sys

2009-06-25 09:29:14

Linux

2010-07-09 16:16:45

SQL Server

2009-12-23 15:52:32

无线上网全接触

2010-09-08 13:42:06

2010-09-13 13:29:38

2021-06-23 08:00:00

Redis服务器缓存

2020-04-28 09:00:00

测试测试自动化

2010-09-10 13:27:42

无线网络辐射

2009-12-03 11:22:07

路由器功能指标

2009-07-02 15:07:40

Java认证考试

2010-04-15 16:58:08

英特尔酷睿高清

2012-09-26 16:32:29

2009-07-15 11:29:18

802.11协议无线网络

2020-11-04 09:00:00

自动化测试回归测试软件测试
点赞
收藏

51CTO技术栈公众号