我有一个带有 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;

异常消息是



在 IDE 中,如果我尝试在 CDS 上设置 Active = True,则会出现类似的异常,
消息所说的发生在 DSnap200.Bpl 中。

它第一次发生在运行时我有某种“事件报告”弹出窗口
主动向 Embarcadero 报告。我第一次看到那个。

如果我用 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 的来源尚不清楚,但肯定是从那时起
上周,因为它不在我上周四晚上碰巧拥有的备份中。

从那以后我唯一安装的东西是一些 3rd-party GUI 实用程序,用于
管理/访问 Access、IB 和 Firebird 数据库,所以罪魁祸首似乎是
其中之一。

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

10-13 03:22