2015-02-23 1 views
2

У меня есть код в классическом ASP и SQL Server, идея проста: иметь хранимую процедуру, чтобы вы могли вставить файл, но до этого sp проверяет, существует ли файл, после чего вернется выходной параметр поэтому я могу проверить его на моей странице asp.Почему выходной параметр моего ADODB.Command не извлекает значение при выполнении?

Проблема не возвращающийся значение выходного параметра ничего, я не можите понять, где проблема ..

СП является:

 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 
+0

Для чего-то же просто, как одно значение полукокса (что случается числовой так или иначе), почему бы не просто используйте 'RETURN 1' в хранимой процедуре, тогда вы можете использовать' adParamReturnValue' 'ParameterDirectionEnum', который не блокируется вызовом' ADODB.Recordset'. – Lankymart

ответ

3

@diana Как есть already 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() 
+0

вы рок! thx u very much .. – Artemination

+0

Спасибо! И «SET», и «SELECT» работают в процедуре, но вот что здесь для меня было ключевой частью, менялось с «set rds = cmd.Execute» только на 'Call cmd.Execute'. Это заставило выходное значение присутствовать в параметре. Хороший совет! – DanneManne

+0

@ DanneManne приветствую вас, потому что «ADODB.Recordset блокирует доступ к выходным параметрам до тех пор, пока он не будет закрыт. – Lankymart

1

в ответ на Why adParamOutput parameter doesn't contain a value after execute объясняет:

Вы должны перебрать все записи, прежде чем вы можете прочитать выходной параметр, как

do until rs.EOF 
    rs.MoveNext 
loop 
+0

Или используйте 'rs.GetRows()', чтобы вернуть массив, а затем закрыть объект 'ADODB.Recordset'. Таким образом, ваш массив доступен для итерации, независимо от того, нужен ли вам доступ к выходным параметрам. – Lankymart

+1

Хотя [ответ вы ссылаетесь] (http://stackoverflow.com/questions/8057433/why-adparamoutput-parameter-doesnt-contain-a-value-after-execute?rq=1) является правильным, они не объясните причину и сделайте так, как будто вы никогда не сможете получить доступ к параметрам «OUTPUT» до тех пор, пока не будут повторены все записи. Это просто неверно, и я буду добавлять свой собственный ответ на этот вопрос, чтобы объяснить это. – Lankymart

Смежные вопросы