2011-02-12 15 views
8

Estoy tratando de utilizar un procedimiento almacenado de SQL Server con ASP:Valor de retorno en el procedimiento almacenado de SQL Server

ALTER PROCEDURE [dbo].[user_insert] 
    @firstName NVARCHAR(50) , 
    @lastName NVARCHAR(50) , 
    @cityid INT , 
    @email NVARCHAR(100) , 
    @password NVARCHAR(12) , 
    @Affiliate INT 
AS 
    BEGIN 
     DECLARE @index1 INT 
     SET @index1 = 0      
     IF (NOT EXISTS (SELECT * FROM  dbo.tbl_users 
          WHERE  user_email = @email) ) 
      BEGIN         
       INSERT INTO dbo.tbl_users 
         (user_first_name , 
          user_last_name , 
          city_id , 
          user_email , 
          user_password , 
          Affiliate_id 
         ) 
       VALUES (@firstName , 
          @lastName , 
          @cityid , 
          @email , 
          @password , 
          @Affiliate 
         ) 
       SET @index1 = (SELECT @@IDENTITY 
      END 
     RETURN @index1 
    END 

y la ASP es

Set oCmd = Server.CreateObject("ADODB.Command") 
oCmd.ActiveConnection = conn 
oCmd.CommandText = "user_insert" 
oCmd.CommandType = 4 

oCmd.Parameters.Append oCmd.CreateParameter("firstName", 203, 1, 100, "1") 
oCmd.Parameters.Append oCmd.CreateParameter("lastName", 203, 1, 100, "2") 
oCmd.Parameters.Append oCmd.CreateParameter("cityid", 3, 1, 2, 1) 
oCmd.Parameters.Append oCmd.CreateParameter("email", 200, 1, 100, txtmail) 
oCmd.Parameters.Append oCmd.CreateParameter("password", 203, 1, 12, "2") 
oCmd.Parameters.Append oCmd.CreateParameter("Affiliate", 3, 1, 3, 1) 
oCmd.Parameters.Append oCmd.CreateParameter("@index1", 3, 2) 
Set rs = oCmd.Execute 
response.write oCmd.Parameters("@index1").Value &"<br>" 
Set oCmd = Nothing 

Si corro el SP en el SQL La terminal del servidor está funcionando, pero cuando uso el código asp, si es un "nuevo usuario", no obtengo ningún valor que devuelva "index1"

¿Qué puedo hacer?

+0

quizás ya tengas usuario con ese correo electrónico en la tabla, verifica eso ya que tu SP no devuelve/hace nada cuando esto es cierto –

+0

No hablo de ASP, pero generalmente creo que necesitas crear un parámetro con una bandera especial que significa 'este es el parámetro de valor de retorno SP'. No estoy seguro del nombre, pero cuando uso ADO en Delphi, siempre se llama '@ RETURN_VALUE'. Alguien con antecedentes ASP seguramente debería ayudar más en ese aspecto. –

Respuesta

8

Cambie a adParamReturnValue como indica la otra respuesta.

También debe suprimir el primer conjunto de resultados, usando SET NOCOUNT ON. También debe dejar de usar @@ IDENTITY, use SCOPE_IDENTITY en su lugar.

ALTER PROCEDURE [dbo].[user_insert] 
    @firstName nvarchar(50), 
    @lastName nvarchar(50), 
    @cityid int, 
    @email nvarchar(100), 
    @password nvarchar(12), 
    @Affiliate int 
AS BEGIN 
    SET NOCOUNT ON 

    IF (not EXISTS (SELECT * FROM dbo.tbl_users WHERE [email protected])) 
    begin         
     INSERT INTO dbo.tbl_users(user_first_name, user_last_name, city_id, user_email, user_password, Affiliate_id)   
     VALUES(@firstName, @lastName, @cityid, @email, @password, @Affiliate) 

     --set 
     RETURN SCOPE_IDENTITY() 
    end 

    RETURN 0 
end 

Nota: incluso se puede omitir el RETORNO 0 al final, ya que 0 es el resultado de retorno por defecto.

2

Su dirección parámetro es adParamOutput (2), pero debe ser adParamReturnValue (4):

oCmd.Parameters.Append oCmd.CreateParameter("@index1", 3, 4) 

Véase el ParamDirctionEnum que CreateParameter tomas.

+0

intente eso. sigue devolviendo nulo – user186585

+0

@ user186585 - Intente descartar '@' del nombre del parámetro. – Oded

+0

es como si el valor de retorno está en un nuevo recoredset por alguna razón – user186585

Cuestiones relacionadas