Assertion failure in DBAccess.pas

谁说胖子不能爱 提交于 2019-12-25 01:59:50

问题


I am interested in upgrading a suite of software from ODAC v5 to v8.2.8.

One app in particular is causing problems. This application loads one of a set of secondary applications implemented as dlls.

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

The launcher is fine - it has its own database connection, and I can step through the various ODAC units fairly happily.

However, the dll immediately excepts on attempting to open a cursor. The error is an Assertion Failure in the unit DBAccess.pas, called from MemDs.pas. I have stepped through this and have shown that the assertion failure is correct; Assert(FieldDesc is TCRFieldDesc) is receiving a TFieldDesc from MemDS.CreateFieldDefs().

I am stumped. How can it be that one calling method works fine (the launcher app) and the other (the dll) always fails ?

If anyone has experienced difficulties in this area I would appreciate any information, however tenuous it might sound


回答1:


We have already fixed this problem. You can either download the latest ODAC version 8.6.12 or modify the line invoking Assert:

in the TCustomDADataSet.GetFieldType method

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



回答2:


we use the DEVART MySQL, and SQL connectors. I have experienced the exact issue with the MySQL (MyDAC) connection. However, what I found was this: In the DBAccess.pas file, the above code change was already there;

Assert(IsClass(FieldDesc, TCRFieldDesc));

But I was still getting the same Assertion error. I stepped in a little further, and found in the CRFunctions unit, I made the following changes, and now my Server connection works perfectly from a dll file:

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;


来源:https://stackoverflow.com/questions/15496878/assertion-failure-in-dbaccess-pas

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!