SET NOCOUNT ON и чтение сообщений с использованием C # и ADO.NET - PullRequest
0 голосов
/ 12 ноября 2009


SET NOCOUNT ON останавливает сообщение, показывающее количество строк, на которые влияет инструкция Transact-SQL или хранимая процедура, как часть набора результатов.


a) Как вы можете читать эти сообщения, используя C # и ADO.NET (я предполагаю, что код C #, читающий эти сообщения, одинаков, независимо от того, были ли выполнены операторы T-SQL в хранимой процедуре, в пакете или…)?


b) Предполагая, что хранимая процедура содержит несколько операторов, как ваш код C # может определить, к какому оператору SQL относятся определенные сообщения?


Спасибо

Ответы [ 4 ]

4 голосов
/ 12 ноября 2009

Информационные сообщения (например, информация о количестве затронутых строк) сообщаются в ADO.Net через событие SqlConnection.InfoMessage . Добавьте делегата к событию, и он будет вызываться всякий раз, когда сервер передает информационное сообщение (т. Е. Любое сообщение об ошибке с серьезностью ниже 10).

нет способа связать информационные источники, такие как подсчитанные данные, с источником. Вам придется сделать это, основываясь на знании логики и понимая, что первое сообщение относится к первому обновлению, второе - ко второму обновлению и т. Д.

Полагаться на количество затронутых строк в клиенте, как правило, плохая практика. Многие проблемы слоев ORM, таких как наборы данных NHibernate и ADO.Net, когда включен параметр SET NOCOUNT ON, просто показывают, насколько проблематична эта практика.

3 голосов
/ 12 ноября 2009

Не полагайтесь на это. Лучшая практика - SET NOCOUNT ON ( обсуждается с моим вопросом здесь )

  • Когда вы загружаете данные, используйте .Count.
  • Используйте параметр OUTPUT для передачи @@ ROWCOUNT обратно (или в качестве набора данных)
2 голосов
/ 12 ноября 2009

Взгляните на этот вопрос и ответы. Вы не можете выполнить (b) выше без добавления некоторого кода в ваш TSQL, который захватывает @@ rowcount и выводит его некоторым образом (например, набор результатов, из которого вы могли бы читать).

1 голос
/ 12 ноября 2009

Один вариант в вашей хранимой процедуре состоит в том, чтобы включить переменные, которые вы передадите обратно счетчикам операторов. Вы можете сделать это, создав свою процедуру с необходимыми параметрами OUTPUT.

FIRST SQL HERE
@FirstSQLCount = @@ROWCOUNT

SECOND SQL HERE
@SecondSQLCount = @@ROWCOUNT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...