2013-09-27 69 views
1

我有以下存儲過程:從存儲過程獲取返回值在VB.NET

ALTER PROCEDURE [dbo].[BK_NUMBER] 
    (@Category NUMERIC(38, 0)) 
WITH EXECUTE AS CALLER 
AS 
    DECLARE @RunningNumber Int 
    DECLARE @min Int 
    DECLARE @max Int 
    DECLARE @newRunningNumber Int 

    BEGIN 

     SELECT @RunningNumber = RunningNumber 
     FROM PARKMARKENNUMMER 
     WHERE PARKMARKENTYP_ID = @Category 

     UPDATE PARKMARKENNUMMER 
     SET RUNNINGNUMBER = @RunningNumber + 1 
     WHERE PARKMARKENTYP_ID = @Category 

     SELECT @newRunningNumber = RunningNumber 
     FROM PARKMARKENNUMMER 
     WHERE PARKMARKENTYP_ID = @Category 

     RETURN @newRunningNumber; 
End; 

我試圖讓@newRunningNumber這個VB代碼:

Dim sqlConnection As New SqlConnection(MSSQL_Helper.strConnectionBookit) 
     Dim command As New SqlCommand("BK_NUMBER", sqlConnection) 
     command.CommandType = CommandType.StoredProcedure 
     command.Parameters.Add("@Category", SqlDbType.Int).Value = ID 
     Dim returnParameter As SqlParameter = command.Parameters.Add("RetVal", SqlDbType.Int) 
     returnParameter.Direction = ParameterDirection.ReturnValue 
     sqlConnection.Open() 
     command.ExecuteNonQuery() 
     sqlConnection.Close() 
     Dim returnValue As Integer = returnParameter.Value 
     Return returnValue 

但它總是返回「0 」。我究竟做錯了什麼?

+0

你是否在SQL服務器中執行您的SP作爲參數傳遞的類別,並驗證它不返回0? –

+3

使用OUTPUT參數,而不是返回值。返回值是針對錯誤/狀態代碼的,而不是針對數據的! –

+0

當你在數據庫中查看PARKMARKENNUMMER中的RunningNumber是否有價值?如果爲null,則添加將爲null並且持續。 – asantaballa

回答

5

你不是真的返回了值:

RETURN @newRunningNumber 

然而,隨着阿龍貝特朗說,你應該將它設置爲OUTPUT參數或SELECT回來了。

OUTPUT:

ALTER PROCEDURE [dbo].[BK_NUMBER] 
(
    @Category NUMERIC(38, 0), 
    @newRunningNumber INT 
) 

Dim newRunningNumber As SqlParameter("@newRunningNumber", SqlDbType.Int) 
newRunningNumber.Direction = ParameterDirection.Output 
// execute 
Dim returnValue As Integer = newRunningNumber.Value 

SELECT:

SELECT @newRunningNumber AS NewRunningNumber 

Dim returnValue As Integer = CType(command.ExecuteScalar(), Integer) 
1

雖然我與其他職位達成一致,輸出參數是去的,大多數人不知道,你可以把多單的方式進入你的命令文本。因爲你可以,你可以將DBA做的東西轉換成你可以使用的東西,而不需要改變你的存儲過程。例如:

CMD.CommandText = "DECLARE @return_value int;EXEC @return_value = [dbo].[BK_NUMBER] (@Category = " & ID & ";SELECT @return_value" 
Dim Ret as int32 = CMD.ExecuteScalar 

這只是您可以做的一個示例。你應該粗略使用參數,以避免注入,並有適當的錯誤處理,等等等等......