2016-11-13 6 views
1

Я создал хранимую процедуру для удаления записи. В этой хранимой процедуре я сначала проверяю использование данных, которые я собираюсь удалить. Если он используется, то хранимая процедура вернет -2, иначе она удалит запись.ExecuteNonQuery всегда возвращает -1

Но проблема в том, что даже запись имеет свой возврат -1 вместо -2. Я также установил NOCOUNT OFF, но не знаю, где проблема.

Я знаю, что этот вопрос уже ответил, установив NOCOUNT OFF но не работает для меня

ALTER PROCEDURE [dbo].[spDeletePIDNumber] 
    @Id int 
AS 
BEGIN 
    SET NOCOUNT OFF; 

    -- Insert statements for procedure here 
    if(exists(select * from tblBills where PID = @Id)) 
    begin 
     return -2 
    end 
    else 
    begin 
     Delete from HelperPIDNumber 
     where Id = @Id 
    end 
END 

public int DeletePIDNumber(int Id) 
{ 
     try 
     { 
      int result = 0; 

      using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.connection)) 
      { 
       var cmd = new SqlCommand("spDeletePIDNumber", conn); 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@Id", Id); 

       conn.Open(); 
       result = cmd.ExecuteNonQuery(); 
      } 

      return result; 
     } 
     catch 
     { 
      throw; 
     } 
    } 
+0

Не можете написать код, который вы пытаетесь? – Geethanga

+0

напишите код, в котором вы используете '.ExecuteNonQuery()' – McNets

+0

и добавьте некоторое возвращаемое значение ниже 'Delete ,,,,' statement. – McNets

ответ

3

Из ExecuteNonQuery документации:

Выполняет Transact-SQL заявление против соединения и возвращается количество затронутых строк.

Имея SET NOCOUNT ON; в вашей процедуре явно указывает на SQL SERVER не возвращать количество строк. В этом случае возврат функции ExecuteNonQuery равен -1.

Также, если процедура не влияет на какие-либо строки, она не будет возвращать количество строк, даже если NOCOUNT - OFF. В этом случае возврат также будет -1.


Что вы, кажется, нужно сделать, это получить return value хранимой процедуры. Вы не получите этого из результата ExecuteNonQuery. Пожалуйста, обратитесь к этому вопросу в StackOverflow: Getting return value from stored procedure in ADO.NET

2

Обычно ExecuteNonQuery будет возвращать количество затронутых записей. Она возвращает -1 в двух случаях:

  1. Когда SET NOCOUNT ON установлен. Из вашего кода ясно, что у вас есть SET NOCOUNT OFF, и поэтому это не проблема в вашем случае.

  2. Если количество затронутых строк ничего, оно вернет -1. В вашем случае, похоже, вы проверяете данные из одной таблицы tblBills и удаляете из другой таблицы HelperPIDNumber. Таким образом, есть больше шансов, что не будет соответствующей записи и ничего не будет удалено.

Пожалуйста, проверьте пункт # 2 выше.

if(exists(select * from tblBills where PID = @Id)) 
begin 
    return -2 
end 
else 
begin 
    Delete from HelperPIDNumber where Id = @Id 
end 
+0

В двух словах возвращаемое значение ExecuteNonQuery является системным зарезервированным значением, вы не должны пытаться вмешиваться в это. Если вы хотите отправить обратно пользовательское значение в код C# из своего SP, используйте выходной параметр и извлеките значение. – Geethanga

+0

@Geethanga Это не мой код :-) Я скопировал код пользователя и выделил возможную проблему из определенной части кода – Aruna

0

использование cmd.ExecuteScalar() вместо cmd.ExecuteNonQuery() в качестве cmd.ExecuteNonQuery() возврата только число изменяемых строк, а не значение, которое вы выбираете.

+0

Nope. Из документации: 'Выполняет запрос и ** возвращает первый столбец первой строки в результирующем наборе, возвращаемом запросом **. Дополнительные столбцы или строки игнорируются. Это не то же самое, что значение ** ** возврата **. –

+0

'return -2' может быть изменено на' SELECT -1' –

+0

OP может это сделать, но это, как правило, плохая идея. Для хранимых процедур обычно рекомендуется возвращать возвращаемые результаты (ы) того же формата (то есть те же столбцы в том же порядке). –

 Смежные вопросы

  • Нет связанных вопросов^_^