2010-10-11 106 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