Консультация № 161211
23.02.2009, 19:00
0.00 руб.
0 1 1
В приложении возникла такая ошибка:
"Приложению 'Microsoft Office Access' не удается открыть базу данных. База данных открыта другим пользователем с монопольным доступом, или файл базы данных отсутствует."
Файл базы данных никем не открыт, ну разве что только когда открываешь само это приложение, то появляется файл ldb, он появляется еще до того, как нажмешь ту самую кнопку, которая вызывает ошибку.
Файл базы данных существует в той же папке, что и exe-файл, вызывается он следующим образом:
В первом юните делается
getdir(0,form1.dbpath);
form1.dbpath:=form1.dbpath+'db.mdb';

Не помню, нужен ли в последней строке слэш, но пробовал оба варианта, все одинаково.
А в том юните, где происходит ошибка акцесс вызывается таким образом
try
Access := GetActiveOleObject('Access.Application');
except
on exception do
begin
Access := CreateOleObject('Access.Application');
end;
access.opencurrentdatabase(form1.dbpath, true); //сюда указывает дебаггер после ошибки
access.docmd.openreport('Поставщики', acViewPreview, EmptyParam, EmptyParam);

Как устранить ошибку?

Обсуждение

Неизвестный
24.02.2009, 07:16
общий
это ответ
Здравствуйте, Coder!
Слеш нужен, и наверно проще использовать
form1.dbpath := GetCurrentDir+'\db.mdb';

В монопольном дуступе не стоит открывать
Передайте параметр false
access.opencurrentdatabase(form1.dbpath, false);

А ошибка в том, что Вы повторно пытаетесь открыть приложение Access которое раннее открыли в монопольном режиме..
попробуйте так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var sPath:String;
Access:Variant;
begin
sPath := GetCurrentDir+'\db.mdb';
try
Access := CreateOleObject('Access.Application');
access.opencurrentdatabase(sPath, false);
access.docmd.openreport('Поставщики', acViewPreview, EmptyParam, EmptyParam);
except
on e:exception do
MessageBox(GetActiveWindow,PChar('Ошибка '+e.Message),'Ошибка',MB_OK+MB_ICONSTOP);
end;
end;


Ну и.. для чего все так сложно??? Гораздо проще работать через ADO с базой. В противном случае, нет смысла использовать приложение написанное на Delphi.

И.. не забывайте закрыть объект после работы, а то так и останется висеть в памяти.. (после нескольких раз запусков – посмотрите в диспетчере задач, сколько там Access`ов).
Форма ответа