sql-server - ExecuteScalar 和 SqlDataAdapter.Fill 对于同一查询表现不同

标签 sql-server vb.net ado.net

我有一个运行的大型存储过程。最后它应该选择一个单一值来表示它是否成功,所以我将查询运行为

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/

相关文章:

sql-server - 在 MS SQL Server 2005 中,当同一 SP 的不同执行访问临时表时会发生什么情况?

javascript - 将 ASP.NET session 传递给 jQuery

c# - 具有 2 个参数的存储过程

VB.net Express 2010 评估?

.net - T-SQL IN 运算符后的数组是否有最大大小?

SQL Server 相当于 PostgreSQL 的 unique on ()

asp.net-mvc - 元数据集合中不存在标识为 ' ' 的成员。\r\n参数名称 : identity

c# - 如何在单个 SQL 连接中运行多个 SQL 命令?

c# - ExecuteNonQuery 在 .NET 4.6.1 中永远挂起

c# - 获取表的关系