2010-10-11 108 views
2

嗨,我正在使用vs 2008在vb.net中做一个winforms应用程序。我有一个数据库与单个表,它有两列,在它和一个存储过程。存储过程应该接受一个输入值,将该值与表中的一列进行匹配,然后从另一列返回相应的值;除了它doesnt.It返回1或0,请谁能告诉我,为什么存储过程的返回值

ALTER PROCEDURE dbo.getgamenumber(@outputnumber bigint OUTPUT, 
            @inputnumber bigint) 
AS 

    SELECT @outputnumber = ggnumber 
    FROM statstable 
    WHERE gindex = @inputnumber 

    RETURN @outputnumber 

和存储过程中因此被称为

With cmdgetgame 
    .CommandType = CommandType.StoredProcedure 
    .CommandText = "getgamenumber" 
    .Parameters.Add("@outputnumber", SqlDbType.BigInt).Value = outputnumber 
    .Parameters("@outputnumber").Direction = ParameterDirection.Output 
    .Parameters.AddWithValue("@inputnumber", inputvalue) 
    returnvalue = cmd.ExecuteScalar() 
End With 

感谢所有和任何帮助。

遗憾的困惑我的VB代码现在看起来像这样

With cmdgetgame 
       .CommandType = CommandType.StoredProcedure 
       .CommandText = "getgamenumber" 
       .Parameters.Add("@outputnumber", SqlDbType.BigInt).Value = outputnumber 
       .Parameters("@outputnumber").Direction = ParameterDirection.Output 
       .Parameters.AddWithValue("@inputnumber", inputvalue) 
       cmd.ExecuteNonQuery() 
       returnvalue = cmdgetgame.Parameters("@outputnumber").Value 
      End With 

和我的存储过程是这样

ALTER PROCEDURE dbo.getgamenumber 
(@outputnumber bigint , 
@inputnumber bigint) 
AS 
    SELECT  ggnumber 
    FROM   statstable 
    WHERE  (gindex = @inputnumber) 

,但我还是没有得到我所期望的价值。

+2

如果你知道你想返回一个值,为什么不使用标量函数呢? – 2010-10-11 15:48:38

+0

你有没有试过直接在SQL服务器上运行sp? – DForck42 2010-10-11 21:02:31

回答

3

啊呀我已经做到了。感谢所有提供帮助的人,它向我展示了我最初的尝试有多么歪曲。我的VB代码现在看起来像这样

With cmdgetgame 
       .Connection = _con 
       .CommandType = CommandType.StoredProcedure 
       .CommandText = "getgamenumber" 
       .Parameters.AddWithValue("@inputnumber", inputvalue) 
       .Parameters.Add("@retvalue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue 
       .ExecuteNonQuery() 
       returnvalue = cmdgetgame.Parameters("@retvalue").Value 


      End With 

和我的存储过程现在看起来像这样

ALTER PROCEDURE dbo.getgamenumber 
(
@inputnumber int 
) 
as 
    declare @retvalue int 

    SELECT  @retvalue = ggnumber 
    FROM   statstable 
    WHERE  (gindex = @inputnumber) 

    return @retvalue 

Pheweee我想我永远不会到达那里。再次感谢。

1

您可以使用ExecuteNonQuery执行存储过程,然后检查输出参数的值。像:

cmd.ExecuteNonQuery() 
returnvalue = .Parameters("@outputnumber").Value 
3

你似乎在试图用@outputnumber既是输出参数和返回值。

当您将它设置为输出参数时,无需在VB.NET中为该参数设置一个值。

然后,你不需要return语句。 (和你不应该使用在T-SQL RETURN得到的值了,反正)

为了得到输出值:

cmd.ExecuteNonQuery() 
returnvalue = cmdgetgame.Parameters("@outputnumber").Value 
1

cmd.ExecuteScalar()将返回第1行的第1列的结果集。 修改你的程序进行:的

SELECT @outputnumber 

代替

RETURN @outputnumber 
+0

这将使存储过程的输出参数期望您读取其结果集。它的工作虽然:-) – Andomar 2010-10-11 16:03:50

+0

所以我的VB现在看起来是这样 – simon 2010-10-11 16:41:47

+0

oppps这样随着cmdgetgame .CommandType = CommandType.StoredProcedure .CommandText = “getgamenumber” 。参数(“@ outputnumber”),参数(“@ outputnumber”)。参数) returnvalue = cmdgetgame.Parameters(“@ outputnumber”)。值 End With – simon 2010-10-11 16:43:57