为什么我的ADODB.Command的输出参数在执行时没有检索到值?

时间:2015-02-23 20:15:27

标签: sql-server stored-procedures asp-classic odbc ado

我在Classic ASP和SQL Server中有一个代码,想法很简单,有一个存储过程,所以你可以插入一个文件,但在此之前,sp将检查文件是否已经存在,之后将返回一个输出参数,所以我可以在我的asp页面上查看它。

问题是输出参数的返回值是什么,我不知道问题在哪里..

SP是:

        ALTER PROCEDURE [dbo].[pi_usu_crear_cuenta]
         @msg_salida    char(1) OUTPUT  /* 0=Registro ya existe, 1=Insert satidfactorio, 2=Update Satidfactorio*/
        ,@usu_email     nvarchar(50)
        ,@usu_alias     nvarchar(50)
        ,@usu_password  nvarchar(50)
        ,@pai_cod       numeric(3,0)
        ,@usu_mayoriaedad char(1)
        ,@pk_pre        int
        ,@usu_respuesta nvarchar(50)

    AS
    BEGIN
        SET NOCOUNT ON;
       IF NOT EXISTS (SELECT * FROM tm_usu_usuarios
                       WHERE usu_email = @usu_email)
       BEGIN
        INSERT INTO tm_usu_usuarios
               (usu_email
               ,usu_alias
               ,usu_password
               ,pai_cod
               ,usu_mayoriaedad
               ,pk_pre
               ,usu_respuesta
               )
         VALUES
               (
                @usu_email
               ,@usu_alias
               ,@usu_password
               ,@pai_cod
               ,@usu_mayoriaedad
               ,@pk_pre
               ,@usu_respuesta
                );
        Select @msg_salida = '1'
       END
   ELSE
   BEGIN
        Select @msg_salida = '2'
   END
    END

经典ASP是:

        Dim cmd2
        Dim Rs_crearcuenta     
        Const adCmdStoredProc = &H0004
        '---- ParameterDirectionEnum Values ----
        Const adParamInput          = &H0001
        Const adParamOutput         = &H0002
        Const adParamReturnValue    = &H0004
        '---- DataTypeEnum Values ----
        Const adInteger     = 3
        Const adChar        = 129
        Const adVarChar     = 200
        Const adVarWChar    = 202
        Const adNumeric     = 131

        Set cmd2 = Server.CreateObject("ADODB.Command")
        Set cmd2.ActiveConnection = Session("Conexion")
        cmd2.CommandText = "pi_usu_crear_cuenta"
        cmd2.CommandType = adCmdStoredProc

        cmd2.Parameters.Append cmd2.CreateParameter("@msg_salida",      adChar,         adParamOutput,      1)      
        cmd2.Parameters.Append cmd2.CreateParameter("@usu_email",       adVarChar,      adParamInput,       50, vEmail)     
        cmd2.Parameters.Append cmd2.CreateParameter("@usu_alias",       adVarChar,      adParamInput,       50, vAlias)     
        cmd2.Parameters.Append cmd2.CreateParameter("@usu_password",    adVarChar,      adParamInput,       50, vPassword)      

        SET param           =  cmd2.CreateParameter("@pai_cod",         adNumeric,      adParamInput,       3, null)
        param.Precision     = 3
        param.NumericScale  = 0
        param.Value         = vPais
        cmd2.Parameters.Append param    'NUMERIC

        cmd2.Parameters.Append cmd2.CreateParameter("@usu_mayoriaedad", adChar,         adParamInput,       1,  vMayoria_edad)      
        cmd2.Parameters.Append cmd2.CreateParameter("@pk_pre",          adInteger,      adParamInput,        ,  vPregunta)      
        cmd2.Parameters.Append cmd2.CreateParameter("@usu_respuesta",   adVarWChar,     adParamInput,       50, vRespuesta)     'NVARCHAR
        cmd2.Prepared = true

        Set Rs_crearcuenta = cmd2.Execute

        vMsgSalida=cmd2.Parameters("@msg_salida").value

        response.write("-")     
        response.write(vMsgSalida)      
        response.write("-")     

        Set Rs_crearcuenta = Nothing
response.end

3 个答案:

答案 0 :(得分:3)

由于@dianaalready pointed out,您无法访问输出参数,因为在查询执行之前它不会被设置。

这是一个常见问题,在这种情况下你可能会想,但我没有执行返回任何结果的查询,我只是插入了一些数据?

乍一看似乎是这种情况,但是当你考虑使用

Select @msg_salida = '1'

您实际上正在返回单行单列ADODB.Recordset对象。

在这些情况下,建议使用SET代替SELECT,因为它不会创建ADODB.Recordset或阻止访问OUTPUT参数,直到所有ADODB.Recordset对象已关闭。

将上述行更改为

SET @msg_salida = '1'

并将ADODB.Command执行更改为

'Execute the command without returning any Recordsets
Call cmd2.Execute()

答案 1 :(得分:1)

正如Why adParamOutput parameter doesn't contain a value after execute上的答案所解释的那样:

在读取输出参数之前,必须遍历所有记录,例如

do until rs.EOF
     rs.MoveNext
loop

答案 2 :(得分:0)

在我的情况下,问题与正在检索的记录集无关。检查Classic ASP脚本中是否正在使用On Error Resume Next,因为可能会吞下导致输出参数永远不会被设置的MSSQL异常。