Ошибка подтверждения в DBAccess.pas

Я заинтересован в обновлении пакета программного обеспечения с 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 ответа

Решение

Мы уже исправили эту проблему. Вы можете скачать последнюю версию ODAC 8.6.12 или изменить строку, вызывающую Assert:

в методе TCustomDADataSet.GetFieldType

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

Мы используем DEVART MySQL и соединители SQL. Я испытал точную проблему с соединением MySQL (MyDAC). Однако я обнаружил следующее: в файле DBAccess.pas указанное выше изменение кода уже было;

Assert (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;
Другие вопросы по тегам