SET NOCOUNT ON将停止显示受Transact-SQL语句或存储过程影响的行数计数的消息作为结果集的一部分返回。
a)如何使用C#和ADO.NET读取这些消息(我假设读取这些消息的C#代码是相同的,无论T-SQL语句是在存储过程中执行,批处理还是......)?
b)假设存储过程包含多个语句,您的C#代码如何识别特定消息所引用的SQL语句?
谢谢
答案 0 :(得分:4)
通过SqlConnection.InfoMessage事件在ADO.Net中报告信息性消息(如受影响的行计数信息)。向事件添加委托,并且只要服务器发送信息性消息(即任何严重性为10的错误消息),就会调用该委托。
无法将信息性消息(如受感染的计数信息)与来源相关联。您将不得不根据逻辑知识来做这件事,并了解第一条消息是指第一次更新,第二条消息是指第二次更新等。
依赖客户端受影响的行数通常是一种不好的做法。许多问题如NHibernate和ADO.Net数据集之类的ORM层在启用SET NOCOUNT ON时只显示了这种做法存在的问题。
答案 1 :(得分:3)
不要依赖它。最佳做法是SET NOCOUNT ON
(discussed with my question here)
答案 2 :(得分:2)
查看this问题和答案。如果没有在TSQL中添加一些代码来捕获@@ rowcount并以某种方式输出它(比如你可以读取的结果集),则不能执行上述(b)。
答案 3 :(得分:1)
您的存储过程中的一个选项是包含您将传回语句计数的变量。您可以使用所需的OUTPUT参数创建过程。
FIRST SQL HERE
@FirstSQLCount = @@ROWCOUNT
SECOND SQL HERE
@SecondSQLCount = @@ROWCOUNT