Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#和ADO.NET设置NOCOUNT并读取消息_C#_Asp.net_Sql_Sql Server_Ado.net - Fatal编程技术网

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

使用C#和ADO.NET设置NOCOUNT并读取消息,c#,asp.net,sql,sql-server,ado.net,C#,Asp.net,Sql,Sql Server,Ado.net,SET-NOCOUNT ON将停止显示受Transact-SQL语句或存储过程影响的行数计数的消息作为结果集的一部分返回 a) 如何使用C#和ADO.NET读取这些消息(我假设读取这些消息的C#代码是相同的,无论T-SQL语句是在存储过程、批处理还是…)中执行的 b) 假设存储过程包含多个语句,您的C代码如何识别特定消息引用的SQL语句 谢谢看看问题和答案。如果不在TSQL中添加一些捕获@@rowcount并以某种方式输出它的代码(如可以从中读取的结果集),则无法执行上面的(b) 存储过程


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


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


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



谢谢

看看问题和答案。如果不在TSQL中添加一些捕获@@rowcount并以某种方式输出它的代码(如可以从中读取的结果集),则无法执行上面的(b)

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

FIRST SQL HERE
@FirstSQLCount = @@ROWCOUNT

SECOND SQL HERE
@SecondSQLCount = @@ROWCOUNT
信息性消息(如受影响的行计数信息)通过事件在ADO.Net中报告。向事件添加一个委托,并在服务器发送信息消息(即严重性低于10的任何错误消息)时调用该委托

无法将信息性消息(如受影响的计数信息)与源关联。你必须根据逻辑知识来做,并且理解第一条消息指的是第一次更新,第二条消息指的是第二次更新,等等


依赖客户端中受影响的行数通常是一种不好的做法。当SET NOCOUNT ON打开时,ORM层(如NHibernate和ADO.Net数据集)会出现许多问题,这表明这种做法有多大问题。

不要依赖它。最佳做法是
不计数
()

  • 加载数据表时,请使用.Count
  • 使用输出参数向后传递@@ROWCOUNT(或作为数据集)

a)ADO.NEt在设置NOCOUNT时存在哪些问题?b) 因此,我不应该使用SqlConnection.InfoMessage事件处理程序来计算受影响的行数,但使用@rowcount可以吗?请参阅。在T-SQL过程中始终使用@@ROWCOUNT means,因此它不存在ADO.Net使用受影响的count消息时遇到的问题。继续阅读ADO.NEt关于设置NOCOUNT的问题,并在您的具体案例中做出判断。您的使用可能是完全安全的。只是要明确一点:关于SET NOCOUNT ON的ADO.Net问题源自ADO.Net对信息消息的依赖,以决定并发控制操作的正确性(确定更新是否成功)。这是一种不好的做法,而不是使用非现实信息本身。这些消息完全可以安全地用作用户反馈。我认为真正的问题是,当nocount关闭时,如何读取发回的计数。这些不是通过InfoMessage事件处理程序实现的。例如,如果使用Microsoft.Data.SqlClient.SqlConnection运行insert语句,则插入的1行的信息消息永远不会到达。