【问题标题】:Retrieving ADO errors using Delphi使用 Delphi 检索 ADO 错误
【发布时间】:2010-11-30 05:34:31
【问题描述】:

我正在使用带有 ADO 的 Delphi 2007 来访问 SQL Server 2008 数据库。

数据库上的存储过程会预先验证输入,如果验证失败,它会返回错误结果集(包含自定义错误信息)。使用 SQL Server Management Studio,当我运行存储过程时,我会在一个选项卡中获得自定义错误结果集,在另一个选项卡中获得本机错误消息。

回到我的 Delphi 应用程序,当我打开存储过程时,我可以访问自定义错误结果集。但是,ADO 连接上的Errors 对象不包含本机错误。

如何访问Errors 集合对象,以便提供有关错误原因的更多信息?

谢谢

【问题讨论】:

    标签: delphi stored-procedures ado error-reporting


    【解决方案1】:

    选项 1) 使用 ADO 连接错误集合。

    try
    ....
    ....
    ....
     ADOQuery1.Open;//Execute your sql statement
    except
      LastErrorIndex  :=ADOConnection1.Errors.Count-1;
      SourceError     :=ADOConnection1.Errors.Item[LastErrorIndex].Source;
      NumberError     :=ADOConnection1.Errors.Item[LastErrorIndex].Number;
      DescriptionError:=ADOConnection1.Errors.Item[LastErrorIndex].Description;
      SQLStateError   :=ADOConnection1.Errors.Item[LastErrorIndex].SQLState;
      NativeError     :=ADOConnection1.Errors.Item[LastErrorIndex].NativeError;
    end;
    

    选项 2) 您可以使用@@error 变量从sql server 获取最后一个错误。

    select @@error
    

    当 Sql Server 发生错误时,你只能得到错误号,使用@@ERROR 全局变量。没有@@ERROR_MESSAGE 全局变量来获取错误描述。 完整的错误信息,可以使用错误号查询master..sysmessages表:

    SELECT Description FROM master..sysmessages  WHERE error= @@ERROR AND msglangid=1033
    

    但大多数这些消息都有占位符(如 %s、%ld),您也可以使用此Stored Procedure

    你可以阅读这篇文章Error Handling in SQL Server – a Background了解更多信息。

    再见。

    【讨论】:

    • 你可以直接说.sql.clear.sql.add,而不是.sql.text :=
    • 感谢 RRUZ。我认为问题在于,使用 ADO,您可以检索结果集和/或返回值,或者在服务器上发生未处理的错误,该错误作为本机 ADO 错误返回。我会请我们的 dba 再看一看,并决定我们将如何返回错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多