在Delphi中找不到陷阱ADO Provider错误

时间:2014-01-14 13:20:40

标签: delphi odbc ado

我有一个用Delphi编写的应用程序,它使用iSeries ODBC连接。

有些工作站我不想安装iSeries软件,在这些工作站上,我不会更新任何这些数据库。

生成此错误消息时是否可以捕获?此时,我可以将NoUpload之类的变量设置为true,并且不允许工作站上的连接。

它似乎发生在我尝试打开其中一个表之前 - 只需在应用程序启动时设置ConnectionString即可触发消息。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您可以使用ADODB.GetProviderNames

检查系统的现有ADO提供商

答案 1 :(得分:3)

理想情况下,您应该寻找一个选项来检查您的状况而不会引发异常。所以Sir Rufo's answer是一个很好的起点。

另一种选择可能是不在ConnectionString中包含提供程序,而是在运行时通过Provider属性独立设置(最有可能仅在确认支持后)。

但是,由于您提到在尝试打开表之前遇到异常,因此需要检查一些事项(假设您在设计时已经设置了组件):

  • 在设计时是否意外遗留了任何数据集Active
  • 连接是否在设计时保持活动状态?
  • ConnectionString中是否有任何可以立即触发错误的选项?

如果不能解决上述问题,您可以为应用程序异常提供一个钩子。 (而且真的是最后的努力。)

使用以下签名声明处理程序方法:TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;。并将其分配给Application.OnException。 E.g。

procedure Handle(ASender: TObject; E: Exception);
begin
  if ISeriesNotInstalledError(E) then
  begin
    FNoUpload := True;
  end
  else
  begin
    Application.ShowException(E);
  end;
end;

注意:遵循此方法有一些重要的注意事项。由于您将此视为标准用例,因此您不希望使用消息来打扰您的用户。这也比局部异常处理程序(一个常见的编程错误)好得多,因为如果调用程序例程触发了这个错误,你不希望调用程序错误地运行就像没有出错一样;什么时候很清楚。