![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADOConnection не отпускает БД Access после Close! [D7]
UnDISCOvery © (2006-01-20 16:43:00)Алоха, Мастера!
Помогите решить такую проблему: решил сделать в проге кнопку при щелчке по которой сжималась бы БД (Акцесс). И все хорошо,да вот только сжимать получается либо до 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
"
Говорит, что БД уже открыта для монопольного доступа, причем под моим аккаунтом! Но ведь я-то отсоединился!!! Других коннектов к БД нет!!!
В чем может быть дело?
Где копать?
UnDISCOvery (2006-01-20 19:40:00) [1]Нашел багу!
Оказывается висела ADOCommand, которая была подключена не через ADOConnection, а через ConnectionString. Причем она просто выполняла UPDATE, даже ничего не открывала. По завершению сбросил строку подключения и блокировка пропала!
Спасибо всем!
sniknik (2006-01-20 18:09:00) [2]> "DAO? не хорошо. имхо. устарел." - как можно еще?
Jet, Jro -> CompactDatabase ;)
> ставил задержку - пофиг
> попробую в цикле ждать пока не пропадет *.ldb.
ну раз ставил и секунды(!) не хватает... то не дождешся. ;) не все закрыл.
UnDISCOvery (2006-01-20 18:05:00) [3]CompactMyBase - не бывает ничего идеального, но тем не менее она нормально отрабатывает до MyConnect.Open и в деструкторе главной формы. Создается впечатление, что ADO что-то буферизирует когда идет работа с БД, и даже после сброса коннекта из приложения все равно держит открытой БД. :( Пришел к этому выводу потому что, такая ситуация возникает только есть добавить запись в любую таблицу БД. А если ничего не добавлять,то все ОК.
"DAO? не хорошо. имхо. устарел." - как можно еще?
ставил задержку - пофиг
попробую в цикле ждать пока не пропадет *.ldb.
sniknik (2006-01-20 17:57:00) [4]> "CompactMyBase;" - такая функция есть, и написал ее я :)
и она "идеальна"? т.е. совсем лишена ошибок, на все времена. (еще один намек)
> через DBEngine.CompactDatabase
DAO? не хорошо. имхо. устарел.
> Коннект не асинхронный. ...
ну задержку то пробовал ставить? тогда гдето еще всетаки есть конект... (смотри по файлу блокировок *.ldb, пока не сотрется база открыта)
UnDISCOvery (2006-01-20 17:42:00) [5]навароты - это я запаниковал :)
первым вариантом и было просто MyConnect.Close;
"CompactMyBase;" - такая функция есть, и написал ее я :) в ней и сжимаю собственно, через DBEngine.CompactDatabase.
Коннект не асинхронный.
with MyConnect do
begin
ConnectOptions:= coConnectUnspecified;
CursorLocation:= clUseServer;
IsolationLevel:= ilReadCommitted;
Mode:= cmUnknown;
end;
sniknik (2006-01-20 17:32:00) [6]все "навороты" с отдельными закрытиями лишние... достаточно
MyConnect.Close;
CompactMyBase; // стати, такой функции нет... (это намек)
и все.
возможно не успевает закрытся (конект не асинхронный случаем?)
попробуй поставь Sleep(1000); между этими командами.
UnDISCOvery (2006-01-20 17:07:00) [7]Пробовал под Win XP SP1 и под WinXP SP2
Johnmen (2006-01-20 17:02:00) [8]Какая ось?