delphi - XE6 ClientDataSet AV 尝试从 Firebird 加载数据

标签 delphi firebird2.5 tclientdataset

我有一个带有 FireDac FDConnection 和 FDSqlQuery 的简约项目, DataSetProvider 和 ClientDataSet,尝试访问示例 我下载的Firebird 2.5包附带的Employee.FDB 今天来自 SourceForge。

除了 FDConnection 弹出信息选项卡中的数据库名称和 FDQuery 的 Sql(设置为 select * from employee)外,所有内容都设置为默认值。 .

FDQuery 打开正常,但一旦我尝试 要在 IDE 中打开 CDS 或运行我的应用程序,我会遇到访问冲突。

这是我的全部代码:

  FDQuery1.Open;
  Caption := IntToStr(FDQuery1.RecordCount);  // this shows 42 on the form's caption
  CDS1.Open;  // AV here

因此,FDQuery 可以正常打开,但 CDS 却不能。

运行时,异常发生在这里:

  function TCustomClientDataSet.CreateDSBase: IDSBase;
  begin
    CreateDbClientObject(CLSID_DSBase, IDSBase, Result);
    Check(Result.SetProp(dspropANSICODEPAGE, DefaultSystemCodePage)); <-- Exception here
    Check(Result.SetProp(dspropUTF8METADATA, NativeUInt(True)));
    Check(Result.SetProp(dspropUTF8ERRORMSG, NativeUInt(True)));
  end;

异常消息是

Project FBTest1 raised exception class $C0000005 with message 'access vioaltion at 0x0075d05b: read of address 0x00000000'.

在 IDE 中,如果我尝试在 CDS 上设置 Active = True,我会遇到类似的异常, 该消息称发生在 DSnap200.Bpl 中。

第一次在运行时发生时,我弹出了某种“事件报告”窗口 主动向内河码头报告此事。第一次见到。

如果我用 SqlConnection 和 SqlQuery 替换 FDac 组件,我得到 同样的错误。

所以,我想我的问题是,是否可以仅通过使用像这样简单的项目的默认属性设置来引发 CDS 的这种行为,即我是否错过了一步,或者这可能是 EMBA QC 的事情?

最佳答案

解决了!感谢 Graymatter 的建议,尝试使用 MidasLib,我得到了 找到问题的根源并修复它,以便该应用程序现在可以使用 Midas.Dll 运行。我将其发布为答案,而不是评论,首先是因为它有点太长了,但更重要的是,原因实际上相当奇怪,解决方案可能会帮助遇到该问题的其他任何人。

首先,我尝试使用 MidasLib,应用程序运行良好,无需 q 所涉及的 AV。

因此,确信当前的 MidasLib 代码不会出现问题后,我去了 回到尝试让应用程序与 Midas.Dll 一起工作。我检查了 Midas.Dll XE6 bin目录和\Windows\SysWOW64中的版本,它们都和我一样 预期为 2014 年 6 月 16 日的 20.0.16277.1276。

追踪DataSnap.DSIntf中的CheckDBlient并仔细观察,一分钱 掉下来,我意识到发生了什么:

procedure CheckDbClient(const CLSID: TGUID);
[...]
begin
  [...]
      if DbClientHandle = 0 then
      begin
        Size := 256;
        SetLength(FileName, Size);
        if RegQueryValue(HKEY_CLASSES_ROOT, PChar(Format('CLSID\%s\InProcServer32',
          [GUIDToString(CLSID)])), PChar(FileName), Size) = ERROR_SUCCESS then
          SetLength(FileName, Size) else
        begin
        [...]
        end;
        DbClientHandle := LoadLibrary(PChar(FileName));

这会从其注册中的 InProcServer 键获取 Midas.Dll 的路径,并且此 没有指向 XE6 的 bin 目录或 SysWOW64,而是指向另一个不存在的位置 我创建的文件,其中包含 2007 年的 Midas.Dll 版本。奇怪的是,与我拥有的 D7 时代的 Dll 副本不同,该 Dll 在其属性页上没有版本信息,但它的创建日期为2002 年 8 月 9 日,文件大小 351Kb。

所以,一旦我发现了这一点,解决问题就像重命名该 Dll 一样简单 操作系统无法加载它,并在SysWOW64中重新注册该版本。

流氓 Midas.Dll 的来源尚不清楚,但它肯定是从那时起就到达的 上周,因为它不在我上周四晚上的备份中。

从那时起我安装的唯一东西是一些第三方 GUI 实用程序 管理/访问 Access、IB 和 Firebird 数据库,所以罪魁祸首似乎是 其中之一。

关于delphi - XE6 ClientDataSet AV 尝试从 Firebird 加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146859/

相关文章:

sql - 如何在 Firebird select 语句中创建从 1 到 100 的范围?

mysql - Windows 7 64 位上的 Delphi XE6,FireDAC 找不到 libmysql.dll

delphi - 如何为我自己的组件创建 Vcl-Theme-Style?

delphi - 在 Delphi 中设置 TStringLists 数组时遇到问题

firebird - Firebird嵌入式服务器是否提供多线程并发?

delphi - Delphi 的断开连接的记录集/数据集

database - Delphi 嵌入式数据库

firebird - 为什么 Firebird 2.5.8 在 SELECT CURRENT_ROLE 上返回 NONE?

Delphi - TClientDataset 线程安全吗?

SQL Server 2008 中 Delphi TClientDataSet "Trying to modify read-only field"错误,2000 中正常