BlackWitcher:
Кто-нибудь сталкивался с траблами при работе UniDAC + SQlite (static)?
UniDAC 7.4.12. Delphi 2010.
Задача - сделать EXE с статически прилинкованной SQLite3.dll, после чего прога должна уметь создавать саму БД, а затем её же и использовать.
Проблема - если сначала создавать файл базы, а затем его подключать и добавлять туда что-либо, то стабильно ловится AV, причем в разных местах.
Странный плавающий баг, очень похожий на этот:
https://forums.devart.com/viewtopic.php?t=38314 Рекомендуемые в том топике правки для линковки внесены, либа пересобрана, но тем не менее, косяки не ушли.
Если использовать внешнюю либу (т.е. без DirectMode), то всё работает.
Алгоритм работы программы примерно следующий:
1. Детектим, есть ли у нас файл с БД. Если есть, то
2. Используем созданный в дизайне TUniConnection для создания файла БД.
3. Достаём из ресурсов DDL-таблиц на SQL, после чего выполняем эти скрипты для создания таблиц.
4. В другом, рабочем TUniConnection подключаем созданную таблицу и начинаем работу с БД (CRUD). Хотя пробовал по-разному - использовать, например, тот же коннекшн что и для создания базы.
Вот уже на этапе работы с БД в разных местах ловится стабильно AV.
Код :
Код: ... CreatorConnection.Database := fPathAndFilename; CreatorConnection.SpecificOptions.Values['ForceCreateDatabase'] := 'True'; //Заставит создать файл БД CreatorConnection.SpecificOptions.Values['Direct'] := 'True'; //Это задано в дизайне try CreatorConnection.Connect; except on E: Exception do begin ........ обработка ошибок Exit; end; end; Sleep(500); //Немного подождем, пока создается сам файл на диске, хотя интервалы пробовал и бОльшие Result := CreatorConnection.Connected; //Set PRAGMA try CreatorConnection.ExecSQL('PRAGMA auto_vacuum = 1'); except on E: Exception do begin ....... end; end; CreatorConnection.Disconnect; //При отключении у нас корректно обрабатывается журнал, если он есть CreatorConnection.Connect; //Заново, для создания таблиц в файле fSQL := TUniSQL.Create(nil); try fSQL.Connection := CreatorConnection; for i := 1 to DBTablesCount do begin try RS := TResourceStream.Create(HInstance, DBTables[i], RT_RCDATA); try fSQL.SQL.LoadFromStream(RS, TEncoding.UTF8); except on E: Exception do begin ....... end; end; if fSQL.SQL.Text <> '' then begin //Exec script for creating table try fSQL.Execute; except on E: Exception do begin ........ end; end; end; finally FreeAndNil(RS); end; end; finally FreeAndNil(fSQL); end; |
Буду признателен за советы и помощь.