powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Блокируется файл БД, несмотря на закрытие базы - как вылечить?
4 сообщений из 4, страница 1 из 1
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
    #39174741
Mikle0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, господа. Прошу помочь с таким неожиданным поведением: файл БД блокирован операционкой (не могу скопировать), пока не завершится процесс, вызывавший код работы с БД. Схема такая: процесс namgr.exe исполняет программу на скриптовом языке, которая использует внешнюю DLL для работы с базой (DLL скомпилирована с файлами sqlite).
Скрипт отрабатывает нормально, база закрывается, но сам файл БД блокируется до завершения exe-шника; при этом повторные запуски скрипта работают как положено, добавляя записи в существующий файл.
При этом dll после завершения скрипта освобождается и выгружается, как может сохраняться блокировка файла, мне непонятно:( Мне нужно, чтобы после завершения скрипта можно было переместить файл БД, не завершая вызывающий скрипт exe.
Что я делаю не так (или не делаю того, что нужно было) ?

открываю базу:
extern "C" _stdcall _export int sql_openDb(char *path){ // 0 - ошибка, 1 - ок
if( sqlite3_open(path, &db) ) ошибка;
if( sqlite3_exec(db, "PRAGMA synchronous = OFF; PRAGMA journal_mode = OFF;", 0, 0, &err) )ошибка;
if( sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS documents(repl text,unid text,dxlText text);", 0, 0, &err) ) ошибка;
if( sqlite3_prepare(db, "INSERT INTO documents VALUES (?,?,?)", -1, &addDoc_stmt, 0) != SQLITE_OK)ошибка;
return 1;
}

в цикле заполняю данными, вызывая функцию из dll:
extern "C" _stdcall _export int sql_addDoc(char *repl, char* unid, char *dxlText){ // 0 - ошибка, 1 - ок
sqlite3_reset(addDoc_stmt);
if( sqlite3_bind_text( addDoc_stmt, 1, repl, strlen(repl), SQLITE_STATIC) != SQLITE_OK )ошибка;
if( sqlite3_bind_text( addDoc_stmt, 2, unid, strlen(unid), SQLITE_STATIC) != SQLITE_OK )ошибка;
if( sqlite3_bind_text( addDoc_stmt, 3, dxlText, strlen(dxlText), SQLITE_STATIC) != SQLITE_OK )ошибка;
if( sqlite3_step(addDoc_stmt) != SQLITE_DONE )ошибка;
return 1;
}

и закрываю базу (и в DLL_PROCESS_DETACH, и явно вызываю после цикла заполнения):
sqlite3_close(db);
...
Рейтинг: 0 / 0
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
    #39174864
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle0xПри этом dll после завершения скрипта освобождается и выгружается,Значит этого не происходит.
Попробуй удалить файл dll когда ты считаешь что он уже выгрузился...


Mikle0xи закрываю базу (и в DLL_PROCESS_DETACH, и явно вызываю после цикла заполнения):
sqlite3_close(db);Ну а кто будет проверить что sqlite3_close() вернула? Она же не обязательно закроет файл...
http://sqlite.org/c3ref/close.html
...
Рейтинг: 0 / 0
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
    #39175576
Mikle0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
Проверил: после завершения скрипта dll можно удалить, а базу нельзя (только скопировать - это можно, да).

Закрытие базы сделал так:
extern "C" _stdcall _export int sql_close(){ // 0 - ошибка, 1 - ок
sqlite3_finalize(addDoc_stmt);
if( sqlite3_close(db)!=SQLITE_OK ){lastErr=sqlite3_errmsg(db); return 0; }
db=0;
return 1;
}
не помогло:(

закрытие базы отрабатывает без ошибки, а переместить/удалить файл базы не даёт.
...
Рейтинг: 0 / 0
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
    #39175588
Mikle0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, плохо проверял - нужно было перезапустить exe, чтобы снять старую блокировку.
Видимо, проблема была в отсутствующем sqlite3_finalize перед закрытием базы - теперь всё ровно, база доступна.
Дело закрыто:)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Блокируется файл БД, несмотря на закрытие базы - как вылечить?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]