【问题标题】:How to force TADOConnection to throw an exception when an SQL error happens after a returned result set返回结果集后发生 SQL 错误时如何强制 TADOConnection 抛出异常
【发布时间】:2019-03-29 13:35:09
【问题描述】:

TADOConnection 不希望在返回某些结果集后发生异常时抛出异常。例如:

ADOConnection1.Execute('SET NOCOUNT ON; SELECT 0; THROW 50000, ''Custom error'', 1;');

上面的代码不会抛出,因为有SELECT 0;引起的结果集

在这种情况下如何强制 TADOConnection 抛出异常?我无法避免返回结果集。我尝试过的事情:

  • 正在处理 OnInfoMessage 事件,但它永远不会被触发。
  • 正在检查 TADOConnection.Errors 属性,但那里没有错误。

我找到了一篇针对此问题的文章,但它涉及 .NET:

The Curious Case of Undetected SQL Exceptions

【问题讨论】:

    标签: delphi delphi-xe2 ado


    【解决方案1】:

    我能够使用 TADOQuery 来显示 Custom Error,如下所示:

    var
      t : integer;
    begin
      ADOQuery1.SQL.Text := 'SET NOCOUNT ON; SELECT 0; THROW 50000, ''Custom error'', 1;';
      ADOQuery1.Open;
      t := 0;
      ADOQuery1.NextRecordset(t); // exception thrown here
    end;
    

    【讨论】:

    • 谢谢,现在如果没有返回结果集,我会遇到问题。 ADOQuery1.Open 在这种情况下不起作用。我想没有通用的方法来处理这两种情况。如果没有更多答案出现,将接受此答案。
    • 嗯,它可能不是最好的解决方案,但是如果您每次编写查询时都知道它是否可以返回结果集,那么您可以选择是否使用 ADOQuery。不幸的是,当然不可能在关闭的 ADOQuery 上执行 NextRecordSet
    • 也许是个愚蠢的建议,但总是在查询中添加select 0 怎么样?
    • 我认为您应该将 TADOCommand 用于不返回结果集的语句。我希望你对执行什么样的语句有一定的控制权,这样你就可以真正决定使用哪个组件。
    • @GuidoG 一点都不傻,我已经尽可能地使用它了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2016-12-15
    • 2020-01-13
    • 2014-03-15
    相关资源
    最近更新 更多