Rückgabewert aus der gespeicherten Prozedur in VB.NET erhalten

Ich habe folgende gespeicherte Prozedur:

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; 

Ich versuche, @newRunningNumber mit diesem VB-Code zu bekommen:

  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 

Aber es kommt immer "0" zurück. Was mache ich falsch?

Du wirst eigentlich nicht den Wert zurückgeben:

 RETURN @newRunningNumber 

Allerdings, wie Aaron Bertrand sagte, sollten Sie es entweder als OUTPUT Parameter oder SELECT es wieder aus.

AUSGABE:

 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 

WÄHLEN:

 SELECT @newRunningNumber AS NewRunningNumber Dim returnValue As Integer = CType(command.ExecuteScalar(), Integer) 

Während ich mit den anderen Beiträgen einverstanden bin, ist der OUTPUT-Parameter der path zu gehen, die meisten Leute wissen nicht, dass du mehr als eine einzelne Zeile in deinen Befehlstext setzen kannst. Weil du kannst, kannst du etwas umwandeln, was ein DBA in etwas macht, das du benutzen kannst, ohne deine gespeicherte Prozedur zu ändern. Beispielsweise:

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

Dies ist nur ein Beispiel dafür, was Sie tun können. Sie sollten von groben Gebrauchsparametern, um Einspritzung zu vermeiden und ordnungsgemäße error handling, usw. zu haben …