使用 Delphi 检索 ADO 错误

Posted

技术标签:

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

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

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

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

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

谢谢

【问题讨论】:

【参考方案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 再看一看,并决定我们将如何返回错误。

以上是关于使用 Delphi 检索 ADO 错误的主要内容,如果未能解决你的问题,请参考以下文章

Delphi - DBGrid 不显示 ADO 表的内容

delphi 中ADO配置,数据连接时,显示测试连接失败,初始化提供的程序错误,灾难性故障,这是因为啥?

delphi+ado+sqlserver怎样在插入之后返回自增字段的值?

使用 ms access 2007 和 ado 部署 delphi 2010 以进行数据库连接所需的文件

Delphi 中的 BDE 与 ADO

delphi中ado连接sqlserver