Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: -0.969 c
2-1140881753
13
2006-02-25 18:35
2006.03.12
иконки в DLL


6-1133293319
red_imp
2005-11-29 22:41
2006.03.12
Как в 7 отправить письмо с вложеными файлами??


2-1141027882
veb
2006-02-27 11:11
2006.03.12
Delphi.NET


2-1140616384
Nirvana
2006-02-22 16:53
2006.03.12
Отображение даты


2-1140421439
VanDet
2006-02-20 10:43
2006.03.12
Помоги gj;fkeqcnf Freeker




   Наверх