【问题标题】:ADO.NET ExecuteScalar() not throwing exceptionADO.NET ExecuteScalar() 不抛出异常
【发布时间】:2017-03-15 11:28:15
【问题描述】:

我正在测试 ExecuteScalar(),特别是它如何处理 SP 中抛出的错误。 执行具有此形状的 SP 时:

throw 50001, '', 1;
select 1;

异常由 ADO.NET 引发(预期行为),但是,如果我执行具有此形状的 SP:

select 1;
throw 50001, '', 1;

没有引发异常(意外行为),我得到了选定的值(在这种情况下为 1)。 我想这与 Sql Server 将其数据流回 ADO.NET 的方式有关,但我不知道如何解决这个问题。

【问题讨论】:

    标签: c# sql-server stored-procedures ado.net executescalar


    【解决方案1】:

    未检测到您抛出的异常的原因是 ExecuteScalar() 方法获取从命令或存储过程返回的第一个结果集并丢弃任何其他结果。

    这意味着当返回结果后引发异常时,您将永远不会使用 ExecuteScalar() 方法看到它,因为该方法已停止从数据库服务器查找结果集,并且基本上忽略了发回的任何其他信息。如果您返回 2 个值(即选择 1;选择 2;抛出;),您可以看到这一点,因为第二个值永远不会被看到。

    如果您担心这种行为,或者您可能希望从存储过程中接收多个结果集,那么您应该使用 ExecuteReader() 获取数据读取器,然后使用读取器对象的 NextResult() 方法进行迭代通过所有返回的结果集,您将看到异常被发送回您的程序。

    【讨论】:

    • 谢谢!我会根据你的解释更新我的代码。
    • @Mauricio - 没问题 - 如果它对你有用,你可以投票作为答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2012-01-24
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多