Работа с DAO через COM

lustig
Дата: 03.10.2005 19:11:10
Всем привет!

Есть задача работать с access из delphi. Не в смысле Select из таблицы, а в смысле использовать DAO в административных целях (восстанавливать, сжимать и еще целая торба всего).
Я понимаю, что код на Delphi, а форум по Access, но Accessa тут как минимум не меньше. Тем более, надеюсь есть люди поработавшие и с тем и с тем.

Подключаюсь к базе (защищенной!!!):
var
  DAO: _DBEngine;
  db: Database;
  ClassID: TGUID;
  V35, V36: string;
begin
  V35 := 'DAO.DBEngine.35';
  V36 := 'DAO.DBEngine.36';

  try
    try
      ClassID := ProgIDToClassID(v36);
    except
      try
        ClassID := ProgIDToClassID(v35);
      except
      raise;
      end;
    end;

    DAO := CreateComObject(ClassID) as _DBEngine;
    db := DAO.OpenDatabase('C:\MyDB.mdb', true, false, '; Wrkgrp="C:\MyMDW.mdw"; USER=user; Pwd=password;');

  finally
  end;
end;

Пишет, мол нет разрешения...
Такой код из accessa работает на ура.
Кто сталкивался, поскажите пожалуйста.
Serge Gavrilov
Дата: 04.10.2005 02:25:55
DAO := CreateComObject(ClassID) as _DBEngine;
DAO.SystemDb := "C:\MyMDW.mdw";
DAO.DefaultUser := "user";
DAO.DefaultPassword := "password";
db := DAO.OpenDatabase('C:\MyDB.mdb', true, false);
lustig
Дата: 04.10.2005 09:31:09
2Serge Gavrilov: Спасибо за участие. Такое в голову приходило, но все упиралось в то, что DAO.SystemDb - readonly property. Однако, на свежую голову нашел DAO.Set_SystemDB(Path), теперь, о чудо, ЗАРАБОТАЛО!!!

Может, кому сгодится:
  DAO := CreateComObject(ClassID) as _DBEngine;
  DAO.Set_SystemDB('C:\MyMDW.mdw');
  DAO.DefaultUser := 'user';
  DAO.DefaultPassword := 'password';
  db := DAO.OpenDatabase('C:\MyMDB.mdb', true, false, '');
Serge Gavrilov
Дата: 04.10.2005 10:29:07
lustig
DAO.SystemDb - readonly property. Однако, на свежую голову нашел DAO.Set_SystemDB(Path), теперь, о чудо, ЗАРАБОТАЛО!!!
[/src]

А какая версия DAO? У меня работает именно так как я указал (значит не read only?), правда я подключаюсь из VB.
lustig
Дата: 04.10.2005 16:48:08
автор

правда я подключаюсь из VB


Думаю именно в этом дело. В delphi есть свой заголовочный *.pas файл для объектов DAO. Который совпадает с исходным определением, но все же какие-то отличия имеются.
4321
Дата: 04.10.2005 17:46:28
lustig
автор

правда я подключаюсь из VB


Думаю именно в этом дело. В delphi есть свой заголовочный *.pas файл для объектов DAO. Который совпадает с исходным определением, но все же какие-то отличия имеются.
в VB после любого открытия датабазы в DBEgine-е и т.п. SystemDB сменить тоже уже не получится:
значение свойства SystemDB должно быть задано до инициализации объекта DBEngine (т.е. до создания экземпляра любого другого объекта доступа к данным). Область определения этого значения ограничена текущим приложением и не может быть изменена без повторного запуска приложения.

Или в паскале даже попытка присвоить не пройдет (не пропустит компилятор)?
lustig
Дата: 04.10.2005 18:28:48
24321:
Рабочую группу можно указать:

DAO.Set_SystemDB('C:\MyMDW.mdw');

Насчет сменить не знаю, попробую-расскажу. В любом случае - это не проблема. Можно пересоздать объект и открыть базу заново.
Serge Gavrilov
Дата: 04.10.2005 18:43:38
4321
в VB после любого открытия датабазы в DBEgine-е и т.п. SystemDB сменить тоже уже не получится:
значение свойства SystemDB должно быть задано до инициализации объекта DBEngine (т.е. до создания экземпляра любого другого объекта доступа к данным). Область определения этого значения ограничена текущим приложением и не может быть изменена без повторного запуска приложения.


Но можно использовать DAO.PrivateDBEngine.35(6) и менять свойство SystemDb как угодно.
Serge Gavrilov
Дата: 04.10.2005 18:46:31
lustig
24321:
Рабочую группу можно указать:

DAO.Set_SystemDB('C:\MyMDW.mdw');

Насчет сменить не знаю, попробую-расскажу. В любом случае - это не проблема. Можно пересоздать объект и открыть базу заново.


Думаю, что пересоздать объект для DBEngine и сменить mdw не получиться, но как это сделать по другому, я уже сказал.