1

次のストアド プロシージャがあります。

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」を返します。私は何を間違っていますか?

4

2 に答える 2

2

他の投稿には同意しますが、OUTPUT パラメーターを使用するのが一番ですが、ほとんどの人は、コマンド テキストに複数の行を入力できることに気づいていません。できるので、ストアド プロシージャを変更せずに、DBA が行ったことを自分が使用できるものに変換できます。例えば:

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

これは、できることのほんの一例です。インジェクションを回避し、適切なエラー処理などを行うために、パラメーターを粗く使用する必要があります...

于 2013-09-27T17:53:48.150 に答える