2011-02-12 115 views
8

我试图用ASP与SQL Server存储过程:在存储过程中的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 

和ASP是

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 

如果我在SQL运行SP服务器终端它的工作,但是当我使用asp代码,如果它是一个“新用户”,我没有得到任何值返回“index1”

我该怎么办?

+0

也许你已经在表中使用该电子邮件了,请检查一下,因为你的SP不返回/做任何事情时,这是真的 – 2011-02-12 19:00:10

+0

我不会说ASP,但通常我认为你需要创建一个参数与一个特殊的标志,意思是“这是SP返回值参数”。不知道名称,但是当我在Delphi中使用ADO时,它总是被命名为“@ RETURN_VALUE”。有ASP背景的人当然应该帮助更多的人。 – 2011-02-12 19:06:27

回答

8

更改为adParamReturnValue作为其他答案状态。

您还需要抑制第一个结果集,使用SET NOCOUNT ON。你也应该停止使用@@ IDENTITY,而是使用SCOPE_IDENTITY。

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 

注:你甚至可以省略在年底返回0,因为0是默认的返回结果。

2

你的参数方向为adParamOutput(2),但应该是adParamReturnValue(4):

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

参见ParamDirctionEnumCreateParameter需要。

相关问题