Консультация онлайн # 161211

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Coder
Дата: 23.02.2009, 19:00 Консультация неактивна
Поступило ответов: 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);

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

Ответ # 1, Виктор Пырлик (Посетитель)

Здравствуйте, 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`ов).

Виктор Пырлик

Посетитель
24.02.2009, 07:16
Нет оценки ответа

Мини-форум консультации # 161211


Нет сообщений в мини-форуме
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.