我有一个运行的大型存储过程。最后它应该选择一个单一值来表示它是否成功,所以我将查询运行为
Dim Command As New SqlCommand(SqlString, Conn)
Return Command.ExecuteScalar()
这有效。但是我的存储过程中有一个错误。我知道它会导致错误,因为存储过程中的逻辑会回滚事务,并且在执行 Scalar 调用之后,我的事务计数降至 0 并且我的数据没有更改。但没有生成 SQL 异常。
奇怪的是,我更改了代码以从 SP 中获取所有结果集,看看是否可以获得更多信息。所以我这样调用同一个SP,
Dim DAObj As SqlDataAdapter = New SqlDataAdapter
Dim CommandObj As SqlCommand = New SqlCommand(SQLString, Conn)
DAObj.SelectCommand = CommandObj
Dim DS As New DataSet()
DAObj.Fill(DS)
当我使用与之前完全相同的 sql 运行此命令并执行完全相同的存储过程时,这次我收到 SQL 异常,因为我的嵌套 SP 调用之一缺少必需的参数。
那么什么可能导致这种情况呢?为什么一种方式运行会产生错误,而另一种方式运行时会出现错误但不报告它?这种差异是有意为之,还是 ADO.Net 中存在某种晦涩难懂的错误?
最佳答案
DataAdaptor 消耗从客户端返回的所有数据集。数据集也是一个异常(exception)。
ExecuteScalar 仅使用第一行、第一列、第一个数据集。
- 不要使用 ExecuteScalar
- 继续使用 DataReader,直到不再返回
- 使用 DataAdaptor.Fill (数据集)。它也会跳过填充数据表的异常
关于sql-server - ExecuteScalar 和 SqlDataAdapter.Fill 对于同一查询表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627096/