DBAccess.pas中的断言失败

时间:2013-03-19 10:25:48

标签: delphi delphi-5 devart odac

我有兴趣将一套软件从ODAC v5升级到v8.2.8。

特别是一个应用程序会导致问题。此应用程序加载一组作为dll实现的辅助应用程序之一。

LibHandle := LoadLibrary(PChar(dllname));
if LibHandle <> 0 then
begin
  @showForm := GetProcAddress(LibHandle,'ShowMainDllForm');
  if (@showForm <> nil) then
  begin
    try
      ShowForm(Application.Handle, @FGlobalVars, 1);

启动器很好 - 它有自己的数据库连接,我可以非常愉快地浏览各种ODAC单元。

但是,dll会在尝试打开游标时立即排除。错误是单位DBAccess.pas中的断言失败,从MemDs.pas调用。我已经逐步完成了这一点,并证明断言失败是正确的; Assert(FieldDesc is TCRFieldDesc)正在从TFieldDesc收到MemDS.CreateFieldDefs()

我很难过。怎么可能一个调用方法工作正常(启动器应用程序)而另一个(dll)总是失败?

如果有人在这方面遇到困难,我会很感激任何信息,不管听起来多么微不足道

2 个答案:

答案 0 :(得分:1)

我们已经解决了这个问题。您可以下载最新的ODAC版本8.6.12或修改调用Assert的行:

TCustomDADataSet.GetFieldType方法中的

replace 
  Assert(FieldDesc is TCRFieldDesc);
with
  Assert(IsClass(FieldDesc, TCRFieldDesc));

答案 1 :(得分:1)

我们使用DEVART MySQL和SQL连接器。我遇到了MySQL(MyDAC)连接的确切问题。但是,我发现的是: 在DBAccess.pas文件中,上面的代码更改已经存在;

断言(IsClass(FieldDesc,TCRFieldDesc));

但我仍然得到相同的断言错误。我进一步介入,在CRFunctions单元中找到了,我进行了以下更改,现在我的服务器连接完全可以从dll文件中运行:

begin
  if IsLibrary then
    Result := IsClassByName(Obj, AClass)
  else
  //------------------------------------
  // Danny MacNevin : October 3,2013
  // commented out the below line to fix an Assertion Error 
  // using the TMyConnection in a dll file.
  // It was being called from the DBAccess.pas file at line: 7251
  // To put this file back to normal, remove the line I added, and 
  // uncomment the line below...
  //------------------------------------
  //Result := Obj is AClass;
    Result := IsClassByName(Obj, AClass) //Line replaced by Danny
end;