使用C#和ADO.NET设置NOCOUNT ON和读取消息

时间:2009-11-12 18:35:58

标签: c# asp.net sql sql-server ado.net


  
    

SET NOCOUNT ON将停止显示受Transact-SQL语句或存储过程影响的行数计数的消息作为结果集的一部分返回。

  


a)如何使用C#和ADO.NET读取这些消息(我假设读取这些消息的C#代码是相同的,无论T-SQL语句是在存储过程中执行,批处理还是......)?


b)假设存储过程包含多个语句,您的C#代码如何识别特定消息所引用的SQL语句?


谢谢

4 个答案:

答案 0 :(得分:4)

通过SqlConnection.InfoMessage事件在ADO.Net中报告信息性消息(如受影响的行计数信息)。向事件添加委托,并且只要服务器发送信息性消息(即任何严重性为10的错误消息),就会调用该委托。

无法将信息性消息(如受感染的计数信息)与来源相关联。您将不得不根据逻辑知识来做这件事,并了解第一条消息是指第一次更新,第二条消息是指第二次更新等。

依赖客户端受影响的行数通常是一种不好的做法。许多问题如NHibernate和ADO.Net数据集之类的ORM层在启用SET NOCOUNT ON时只显示了这种做法存在的问题。

答案 1 :(得分:3)

不要依赖它。最佳做法是SET NOCOUNT ONdiscussed with my question here

  • 加载数据表时,请使用.Count。
  • 使用OUTPUT参数传回@@ ROWCOUNT(或作为数据集)

答案 2 :(得分:2)

查看this问题和答案。如果没有在TSQL中添加一些代码来捕获@@ rowcount并以某种方式输出它(比如你可以读取的结果集),则不能执行上述(b)。

答案 3 :(得分:1)

您的存储过程中的一个选项是包含您将传回语句计数的变量。您可以使用所需的OUTPUT参数创建过程。

FIRST SQL HERE
@FirstSQLCount = @@ROWCOUNT

SECOND SQL HERE
@SecondSQLCount = @@ROWCOUNT