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