Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизADOConnection не отпускает БД Access после Close! Найти похожие ветки
← →
UnDISCOvery (2006-01-20 16:43) [0]Алоха, Мастера!
Помогите решить такую проблему: решил сделать в проге кнопку при щелчке по которой сжималась бы БД (Акцесс). И все хорошо,да вот только сжимать получается либо до MyConnect.Open, либо после MyConnect.Free в деструкторе. А вот такой код в "середине" не работает:
"
for i:=0 to MyConnect.DataSetCount-1 do
MyConnect.DataSets[i].Close;
for i:=0 to MyConnect.CommandCount-1 do
MyConnect.Commands[i].Cancel;
if MyConnect.InTransaction then MyConnect.CommitTrans;
MyConnect.KeepConnection:= false;
MyConnect.Close;
CompactMyBase. // !!!!!!! failed - exception
"
Говорит, что БД уже открыта для монопольного доступа, причем под моим аккаунтом! Но ведь я-то отсоединился!!! Других коннектов к БД нет!!!
В чем может быть дело?
Где копать?
← →
Johnmen © (2006-01-20 17:02) [1]Какая ось?
← →
UnDISCOvery (2006-01-20 17:07) [2]Пробовал под Win XP SP1 и под WinXP SP2
← →
sniknik © (2006-01-20 17:32) [3]все "навороты" с отдельными закрытиями лишние... достаточно
MyConnect.Close;
CompactMyBase; // стати, такой функции нет... (это намек)
и все.
возможно не успевает закрытся (конект не асинхронный случаем?)
попробуй поставь Sleep(1000); между этими командами.
← →
UnDISCOvery (2006-01-20 17:42) [4]навароты - это я запаниковал :)
первым вариантом и было просто MyConnect.Close;
"CompactMyBase;" - такая функция есть, и написал ее я :) в ней и сжимаю собственно, через DBEngine.CompactDatabase.
Коннект не асинхронный.
with MyConnect do
begin
ConnectOptions:= coConnectUnspecified;
CursorLocation:= clUseServer;
IsolationLevel:= ilReadCommitted;
Mode:= cmUnknown;
end;
← →
sniknik © (2006-01-20 17:57) [5]> "CompactMyBase;" - такая функция есть, и написал ее я :)
и она "идеальна"? т.е. совсем лишена ошибок, на все времена. (еще один намек)
> через DBEngine.CompactDatabase
DAO? не хорошо. имхо. устарел.
> Коннект не асинхронный. ...
ну задержку то пробовал ставить? тогда гдето еще всетаки есть конект... (смотри по файлу блокировок *.ldb, пока не сотрется база открыта)
← →
UnDISCOvery (2006-01-20 18:05) [6]CompactMyBase - не бывает ничего идеального, но тем не менее она нормально отрабатывает до MyConnect.Open и в деструкторе главной формы. Создается впечатление, что ADO что-то буферизирует когда идет работа с БД, и даже после сброса коннекта из приложения все равно держит открытой БД. :( Пришел к этому выводу потому что, такая ситуация возникает только есть добавить запись в любую таблицу БД. А если ничего не добавлять,то все ОК.
"DAO? не хорошо. имхо. устарел." - как можно еще?
ставил задержку - пофиг
попробую в цикле ждать пока не пропадет *.ldb.
← →
sniknik © (2006-01-20 18:09) [7]> "DAO? не хорошо. имхо. устарел." - как можно еще?
Jet, Jro -> CompactDatabase ;)
> ставил задержку - пофиг
> попробую в цикле ждать пока не пропадет *.ldb.
ну раз ставил и секунды(!) не хватает... то не дождешся. ;) не все закрыл.
← →
UnDISCOvery (2006-01-20 19:40) [8]Нашел багу!
Оказывается висела ADOCommand, которая была подключена не через ADOConnection, а через ConnectionString. Причем она просто выполняла UPDATE, даже ничего не открывала. По завершению сбросил строку подключения и блокировка пропала!
Спасибо всем!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c