当前位置:中国站长下载文章中心网页编程ASP编程 → ASP开发中存储过程应用全接触(2)

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

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-13 0:34:48
    
    3. 有返回值的存储过程
  
    在进行类似SP2的操作时,应充分利用SQL Server强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储过程返回执行情况,为此,将SP2修改如下:
  
  /*SP3*/
  CREATE PROCEDURE dbo.delUserAll
  as
  set nocount on
  begin
  BEGIN TRANSACTION
  delete from dbo.[userinfo]
  IF @@error=0
  begin
  COMMIT TRANSACTION
  return 1
  end
  ELSE
  begin
  ROLLBACK TRANSACTION
  return 0
  end
  return
  end
  go
  
    以上存储过程,在delete顺利执行时,返回1,否则返回0,并进行回滚操作。为了在ASP中取得返回值,需要利用Parameters集合来声明参数:
  
  '**调用带有返回值的存储过程并取得返回值**
  DIM MyComm,MyPara
  Set MyComm = Server.CreateObject("ADODB.Command")
  MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
  MyComm.CommandText = "delUserAll" '指定存储过程名
  MyComm.CommandType = 4 '表明这是一个存储过程
  MyComm.Prepared = true '要求将SQL命令先行编译
  '声明返回值
  Set Mypara = MyComm.CreateParameter("RETURN",2,4)
  MyComm.Parameters.Append MyPara
  MyComm.Execute
  '取得返回值
  DIM retValue
  retValue = MyComm(0) '或retValue = MyComm.Parameters(0)
  Set MyComm = Nothing
  
    在MyComm.CreateParameter("RETURN",2,4)中,各参数的含义如下:
  
    第一个参数("RETURE")为参数名。参数名可以任意设定,但一般应与存储过程中声明的参数名相同。此处是返回值,我习惯上设为"RETURE";
  
    第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码:
  
  adBigInt: 20 ;
  adBinary : 128 ;
  adBoolean: 11 ;
  adChar: 129 ;
  adDBTimeStamp: 135 ;
  adEmpty: 0 ;
  adInteger: 3 ;
  adSmallInt: 2 ;
  adTinyInt: 16 ;
  adVarChar: 200 ;
  
    对于返回值,只能取整形,且-1到-99为保留值;
  
    第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下:
  
    0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值
  
    以上给出的ASP代码,应该说是完整的代码,也即最复杂的代码,其实
  
  Set Mypara = MyComm.CreateParameter("RETURN",2,4)
  MyComm.Parameters.Append MyPara
  
    可以简化为
  
  MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
  
    甚至还可以继续简化,稍后会做说明。
  
    对于带参数的存储过程,只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用,但我没有试成过)。
  
    4. 有输入参数和输出参数的存储过程
  
    返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储过程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数----用户ID,和一个输出参数----用户名。实现这一功能的存储过程如下:
  
  /*SP4*/
  CREATE PROCEDURE dbo.getUserName
  @UserID int,
  @UserName varchar(40) output
  as
  set nocount on
  begin
  if @UserID is null return
  select @UserName=username
  from dbo.[userinfo]
  where userid=@UserID
  return
  end
  go
  
    调用该存储过程的ASP代码如下:
  
  '**调用带有输入输出参数的存储过程**
  DIM MyComm,UserID,UserName
  UserID = 1
  Set MyComm = Server.CreateObject("ADODB.Command")
  MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
  MyComm.CommandText = "getUserName" '指定存储过程名
  MyComm.CommandType = 4 '表明这是一个存储过程
  MyComm.Prepared = true '要求将SQL命令先行编译
  '声明参数
  MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)
  MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)
  MyComm.Execute
  '取得出参
  UserName = MyComm(1)
  Set MyComm = Nothing
  
    在以上代码中,可以看到,与声明返回值不同,声明输入参数时需要5个参数,声明输出参数时需要4个参数。声明输入参数时5个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时,没有最后一个参数:参数值。
  
    需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。
  
    如果存储过程有多个参数,ASP代码会显得繁琐,可以使用with命令简化代码:
  
  '**调用带有输入输出参数的存储过程(简化代码)**
  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("@UserID",3,1,4,UserID)
   .Parameters.append .CreateParameter("@UserName",200,2,40)
   .Execute
  end with
  UserName = MyComm(1)
  Set MyComm = Nothing
  
    假如我们要取得ID为1到10,10位用户的用户名,是不是要创建10次Command对象呢?不是的。如果需要多次调用同一存储过程,只需改变输入参数,就会得到不同的输出:
  
  '**多次调用同一存储过程**
  DIM MyComm,UserID,UserName
  UserName = ""
  Set MyComm = Server.CreateObject("ADODB.Command")
  for UserID = 1 to 10
   with MyComm
    .ActiveConnection = MyConStr 'MyConStr是数据库连接字串
    .CommandText = "getUserName" '指定存储过程名
    .CommandType = 4 '表明这是一个存储过程
    .Prepared = true '要求将SQL命令先行编译
    if UserID = 1 then
     .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
     .Parameters.append .CreateParameter("@UserName",200,2,40)
     .Execute
    else
     '重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明)
     .Parameters("@UserID") = UserID
     .Execute
    end if
   end with
   UserName = UserName + MyComm(1) + "," '也许你喜欢用数组存储
  next
  Set MyComm = Nothing
  
    通过以上代码可以看出:重复调用同一存储过程时,只需为值发生改变的输入参数重新赋值即可,这一方法在有多个输入输出参数,且每次调用时只有一个输入参数的值发生变化时,可以大大减少代码量。
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。