日期:2011-12-16  浏览次数:20879 次

  返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储过程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数----用户ID,和一个输出参数----用户名。实现这一功能的存储过程如下:<br><br> <table style="WIDTH: 475px; HEIGHT: 220px" borderColor=#cccccc width=475 align=center bgColor=#e3e3e3 border=1> <tr> <td>/*SP4*/<br>CREATE PROCEDURE dbo.getUserName<br>@UserID int,<br>@UserName varchar(40) output<br>as<br>set nocount on<br>begin<br>if @UserID is null return<br>select @UserName=username <br>from dbo.[userinfo] <br>where userid=@UserID<br>return<br>end<br>go</td></tr></table><br>  调用该存储过程的ASP代码如下:<br><br> <table style="WIDTH: 507px; HEIGHT: 242px" borderColor=#cccccc width=507 align=center bgColor=#e3e3e3 border=1> <tr> <td>'**调用带有输入输出参数的存储过程**<br>DIM MyComm,UserID,UserName<br>UserID = 1<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串<br>MyComm.CommandText = "getUserName" '指定存储过程名<br>MyComm.CommandType = 4 '表明这是一个存储过程<br>MyComm.Prepared = true '要求将SQL命令先行编译<br>'声明参数<br>MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)<br>MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)<br>MyComm.Execute<br>'取得出参<br>UserName = MyComm(1)<br>Set MyComm = Nothing</td></tr></table><br>  在以上代码中,可以看到,与声明返回值不同,声明输入参数时需要5个参数,声明输出参数时需要4个参数。声明输入参数时5个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时,没有最后一个参数:参数值。<br><br>  需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。<br><br>  如果存储过程有多个参数,ASP代码会显得繁琐,可以使用with命令简化代码:<br><br> <table style="WIDTH: 473px; HEIGHT: 243px" borderColor=#cccccc width=473 align=center bgColor=#e3e3e3 border=1> <tr> <td>'**调用带有输入输出参数的存储过程(简化代码)**<br>DIM MyComm,UserID,UserName<br>UserID = 1<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>with MyComm<br> .ActiveConnection = MyConStr 'MyConStr是数据库连接字串<br> .CommandText = "getUserName" '指定存储过程名<br> .CommandType = 4 '表明这是一个存储过程<br> .Prepared = true '要求将SQL命令先行编译<br> .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)<br> .Parameters.append .CreateParameter("@UserName",200,2,40)<br> .Execute<br>end with<br>UserName = MyComm(1)<br>Set MyComm = Nothing</td></tr></table><br>  假如我们要取得ID为1到10,10位用户的用户名,是不是要创建10次Command对象呢?不是的。如果需要多次调用同一存储过程,只需改变输入参数,就会得到不同的输出:<br><br> <table style="WIDTH: 489px; HEIGHT: 372px" borderColor=#cccccc width=489 align=center bgColor=#e3e3e3 border=1> <tr> <td>'**多次调用同一存储过程**<br>DIM MyComm,UserID,UserName<br>UserName = ""<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>for UserID = 1 to 10<br> with MyComm<br>  .ActiveConnection = MyConStr 'MyConStr是数据库连接字串<br>  .CommandText = "getUserName" '指定存储过程名<br>  .CommandType = 4 '表明这是一个存储过程<br>  .Prepared = true '要求将SQL命令先行编译<br>  if UserID = 1 then<br>   .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)<br>   .Parameters.append .CreateParameter("@UserName",200,2,40)<br>   .Execute<br>  else<br>   '重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明)<br>   .Parameters("@UserID") = UserID<br>   .Execute<br>  end if<br> end with<br> UserName = UserName + MyComm(1) + "," '也许你喜欢用数组存储<br>next<br>Set MyComm = Nothing</td></tr></table><br>  通过以上代码可以看出:重复调用同一存储过程时,只需为值发生改变的输入参数重新赋值即可,这一方法在有多个输入输出参数,且每次调用时只有一个输入参数的值发生变化时,可以大大减少代码量。<br> <P>  <b>