从VB.NET中的存储过程获取返回值

Pak*_*aks 1 vb.net sql-server

我有以下存储过程:

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;
Run Code Online (Sandbox Code Playgroud)

我尝试@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
Run Code Online (Sandbox Code Playgroud)

但它总是返回"0".我究竟做错了什么?

zim*_*nen 5

你实际上没有返回值:

RETURN @newRunningNumber
Run Code Online (Sandbox Code Playgroud)

但是,正如Aaron Bertrand所说,您应该将其设置为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
Run Code Online (Sandbox Code Playgroud)

选择:

SELECT @newRunningNumber AS NewRunningNumber

Dim returnValue As Integer = CType(command.ExecuteScalar(), Integer)
Run Code Online (Sandbox Code Playgroud)