当前位置:51VIP源码软件音乐小游戏下载联盟网络学院网络编程ASP技巧 → ASP与存储过程实践(实例)

ASP与存储过程实践(实例)

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2008-8-28 3:37:58 我要发布文章

    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

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


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

    /*SP7*/
    CREATE PROCEDURE dbo.getUserInfo
       @userid int,
       @checklogin bit
    as
    set nocount on
    begin
       if @userid is null or @checklogin is null return
       select username
          from dbo.[usrinfo]
          where userid=@userid
       --若为登录用户,取usertel及usermail
       if @checklogin=1
          select usertel,usermail
             from dbo.[userinfo]
             where userid=@userid
       return
    end
    go

    以下是ASP代码:

    '**调用返回多个记录集的存储过程**
    DIM checklg,UserID,UserName,UserTel,UserMail
    DIM MyComm,MyRst
    UserID = 1
    'checklogin()为自定义函数,判断访问者是否登录
    checklg = checklogin()
    Set MyComm = Server.CreateObject("ADODB.Command")
    with MyComm
       .ActiveConnection = MyConStr          'MyConStr是数据库连接字串
       .CommandText      = "getUserInfo"     '指定存储过程名
       .CommandType      = 4                 '表明这是一个存储过程
       .Prepared         = true              '要求将SQL命令先行编译
       .Parameters.append .CreateParameter("@userid",3,1,4,UserID)
       .Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)
       Set MyRst = .Execute
    end with
    Set MyComm = Nothing

    '从第一个记录集中取值
    UserName = MyRst(0)
    '从第二个记录集中取值
    if not MyRst is Nothing then
       Set MyRst = MyRst.NextRecordset()
       UserTel  = MyRst(0)
       UserMail = MyRst(1)
    end if
    Set MyRst = Nothing

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


    至此,针对ASP调用存储过程的各种情况,本文已做了较为全面的说明。最后说一下在一个ASP程序中,调用多个存储过程的不同方法。
    在一个ASP程序中,调用多个存储过程至少有以下三种方法是可行的:
    1. 创建多个Command对象

    DIM MyComm
    Set MyComm = Server.CreateObject("ADODB.Command")
    '调用存储过程一
    ......
    Set MyComm = Nothing
    Set MyComm = Server.CreateObject("ADODB.Command")
    '调用存储过程二
    ......
    Set MyComm = Nothing
    ......

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

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

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

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

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

    一般认为,重复创建对象是效率较低的一种方法,但是经测试(测试工具为Microsoft Application Center Test),结果出人意料:
    方法2 >= 方法1 >> 方法3
    方法2的运行速度大于等于方法1(最多可高4%左右),这两种方法的运行速度远大于方法3(最多竟高达130%),所以建议在参数多时,采用方法1,在参数较少时,采用方法2。

    花了一天的时间,终于把我对于在ASP中调用存储过程的一些粗浅的经验形成了文字。这其中,有些是我只知其果而不明其因的,有些可能是错误的,但是,这些都是经过我亲身实践的。各位看官批判地接受吧。有不同意见,希望一定向我指明,先谢了。

上一页  [1] [2] [3]