Ошибка подтверждения в 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;