Показать, сколько строк было удалено

Я использую программу C #, и моя база данных находится на сервере SQL 2008.

Когда пользователь удалил несколько строк из базы данных, я хочу показать ему/ей в приложении Windows, сколько строк удалено.

Я хочу знать, как я могу отправить сообщение SQL на С# и показать его пользователю. Например, когда я удалил 4 строки из таблицы, SQL показывает сообщение типа (затронуты 4 строки). Теперь я хочу отправить номер 4 в свою программу на С#. Как мне это сделать? Спасибо.


person mahnaz    schedule 27.08.2010    source источник


Ответы (4)


Если вы используете SqlCommand из своего приложения .NET для выполнения удаления/обновления, результат ExecuteNonQuery() возвращает количество строк, затронутых последним оператором команды.

См. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx.

person kbrimington    schedule 27.08.2010
comment
Обратите внимание, что параметр NOCOUNT SQL Server мешает возвращаемому значению ExecuteNonQuery, если он включен. (petesbloggerama.blogspot.com/2006 /10/), (aspsoft.blogs.com/jonas/ 2006/10/executenonquery.html) - person Dr. Wily's Apprentice; 28.08.2010
comment
Означает ли это, что функция executeNoneQuery() возвращает значение int, и я могу поместить его в параметр int? например: int count = executeNoneQuery(); - person mahnaz; 28.08.2010
comment
большое спасибо. Я использую эту команду, и она сработала. //----------------------- SqlDataAdapter››››››››››››sda .......... int count= sda.DeleteCommand.ExecuteNonQuery(); - person mahnaz; 28.08.2010
comment
@Dr Wily: Спасибо за напоминание. @махназ: Да. Если вы используете этот API, вы можете использовать int count = myCommand.ExecuteNonQuery();. - person kbrimington; 28.08.2010

Я предполагаю, что вы хотели бы выбрать «количество» в операторе удаления, прежде чем выдать удаление, а затем захватить число и манипулировать им по мере необходимости.

person Holman716    schedule 27.08.2010
comment
Это хорошая идея. Обратите внимание, что для обеспечения надежности требуется хорошее управление транзакциями. - person kbrimington; 28.08.2010
comment
Есть способы встроенные в SQL, чтобы избежать необходимости выполнять 2 запроса - person DaveShaw; 28.08.2010
comment
+1, так как я обычно справляюсь с этим, используя Linq-to-Sql. - person kbrimington; 28.08.2010

Используйте переменную среды SQL @@RowCount. Вы можете вернуть его из хранимой процедуры, если вы их используете.

person DaveShaw    schedule 27.08.2010

Если вы используете метод System.Data.SqlClient.SqlCommand.ExecuteNonQuery или метод System.Data.Common.DbCommand.ExecuteNonQuery, то возвращаемое значение должно быть количеством строк, затронутых вашим оператором (я думаю, последним оператором в вашей команде).

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

в T-SQL есть переменная @@rowcount, к которой вы можете получить доступ, чтобы получить количество строк, затронутых последним оператором. Очевидно, вам нужно будет получить это сразу после оператора DELETE, но я считаю, что вы могли бы сделать return @@rowcount в своем T-SQL, если вы используете SET NOCOUNT ON.

В качестве альтернативы можно было бы вернуть значение как параметр OUTPUT, особенно если у вас есть пакет из нескольких операторов, и вы хотели бы знать, сколько строк затрагивается каждым из них. Некоторым людям нравится использовать оператор T-SQL RETURN для сообщения об успехе/неуспехе, поэтому вы можете не возвращать «количество затронутых строк» ​​для согласованности.

person Dr. Wily's Apprentice    schedule 27.08.2010