В C# как получить возвращаемое значение из хранимой процедуры с помощью executenonquery

у меня есть следующий запрос:

create proc [dbo].[DeleteParts] 
    @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
    DECLARE @Returns BIT 
    SET @Returns = 1 

    BEGIN 
       TRY  
          BEGIN TRANSACTION 

          DELETE FROM PARTABLE 
          WHERE TransNo = @TransNo and fpart = @fpart

          COMMIT 
       END TRY 
       BEGIN CATCH   
           Print 'Delete failed'    
           SET @Returns = 0      
           -- Any Error Occurred during Transaction. Rollback     
           IF @@TRANCOUNT > 0       
               ROLLBACK  -- Roll back 
       END CATCH

       RETURN @Returns

это прекрасно компилируется.

В C# я хочу выполнить этот запрос и получить возвращаемое значение.

мой код, как показано ниже:

using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);

   string ReturnValue = deletecommand.ExecuteNonQuery().ToString();
}

это не дает мне никаких ошибок, но вместо этого он возвращает количество затронутых строк, я хочу вернуть 1 или 0.

пример: если операция удаления выполнена успешно, верните 1, а если она не удалась, верните 0.

любая помощь с исходным кодом будет будьте благодарны.

спасибо,

Прадип

8 ответов


вам нужен параметр с Direction значение ParameterDirection.ReturnValue

что-то типа:

SqlParameter returnParameter = deleteCommand.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
...
deleteCommand.ExecuteNonQuery();
...
int returnValue = (int) returnParameter.Value;

хранимая процедура должна возвращать это возвращаемое значение, конечно:

create proc [dbo].[DeleteParts]      
    @TransNo nvarchar (6),   
    @fpart nvarchar(25)  
AS      
DECLARE @Returns BIT      
SET @Returns = 1     
...
RETURN @Returns

Я не вижу, что вы возвращаете значение. Добавьте оператор Return, чтобы вернуть любое значение из сохраненного proc.


ExecuteNonQuery вернет количество затронутых строк, но не данные (вот почему его не запрос). Так что это ничего не вернет.

Это может быть полезно для чтения:

http://www.dreamincode.net/forums/topic/76434-executenonquery-with-output-parameters/

вам нужно будет использовать другой механизм, чтобы получить ваши данные - как насчет ExecuteReader С выходным параметром?


ExecuteNonQuery() возвращает @@ROWCOUNT который вы не можете установить. Поэтому вы не можете использовать его для возврата значений.


обычно результат возвращается в виде строки, как и обычный запрос select. Вы можете получить его с помощью считывателя или адаптера.


вы должны указать тип вывода в хранимых процедурах такой

@IDout                  [int] output

затем добавьте этот параметр

SPParamReturnCollection sp = new SPParamReturnCollection();
        sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int });

IF EXISTS(SELECT TransNo FROM [PARTABLE] WHERE TransNo = @TransNo and fpart = @fpart
        BEGIN                       
            DELETE FROM PARTABLE 
                        WHERE TransNo = @TransNo and fpart = @fpart

            SELECT @TransNo AS RETURNVAL
        END
        ELSE
        BEGIN
             SELECT 0 AS RETURNVAL
        END

именование переменной "@Returns " не волшебным образом возвращает ее значение, вы должны фактически вернуть значение.

вы не можете вернуть битовое значение, возвращаемое значение всегда является целым числом. Если вы хотите отправить битовое значение обратно, вам придется использовать выходной параметр.

добавить return показания к процедуре:

create proc [dbo].[DeleteParts] 
  @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
  DECLARE @Returns INT
  SET @Returns = 1 

  BEGIN 
    TRY  
      BEGIN TRANSACTION 

      DELETE FROM PARTABLE 
      WHERE TransNo = @TransNo and fpart = @fpart

      COMMIT 
    END TRY 
    BEGIN CATCH   
       Print 'Delete failed'    
       SET @Returns = 0      
       -- Any Error Occurred during Transaction. Rollback     
       IF @@TRANCOUNT > 0       
           ROLLBACK
    END CATCH

RETURN @Returns

добавить параметр с направлением ReturnValue для получения возвращаемого значения:

int returnValue;
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
   var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   deletecommand.ExecuteNonQuery();
   returnValue = (int)returnParameter.Value;
}