ExecuteScalar和SqlDataAdapter.Fill对于相同的查询表现不同

时间:2011-07-08 15:55:25

标签: sql-server vb.net ado.net

我运行了一个很大的存储过程。最后它应该选择一个单值来说明它是否成功,所以我运行查询

Dim Command As New SqlCommand(SqlString, Conn)
Return Command.ExecuteScalar()

哪个有效。但是,我的存储过程中存在错误。我知道它导致错误,因为存储过程中的逻辑回滚事务,并且在Execute 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中的某种模糊错误?

2 个答案:

答案 0 :(得分:3)

DataAdaptor使用从客户端返回的所有数据集。数据集也是一个例外。

ExecuteScalar仅消耗第1行第1列第1个数据集。

  • 不要使用ExecuteScalar
  • 继续使用DataReader,直到不再支持
  • 使用DataAdaptor.Fill(DataSet)。它也将跳过填写DataTables的例外

答案 1 :(得分:1)

.ExecuteScalar()返回返回的第一个值,无论是存储过程中的值,还是存储过程生成的错误代码。 fill命令期望返回数据,并且sql中的错误会引发异常。