Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Создание новой MS Access базы данных


Автор: Vit 1.4.2002, 06:31
Приведенная ниже процедура создает пустую базу данных MS Access

Код

Procedure CreateMSAccessDatabase(filename : String);
var  DAO: Variant;
    i:integer;
Const Engines:array[0..2] of string=('DAO.DBEngine.36', 'DAO.DBEngine.35', 'DAO.DBEngine');

    Function CheckClass(OLEClassName:string):boolean;
    var Res: HResult;
    begin
      Result:=CoCreateInstance(ProgIDToClassID(OLEClassName), nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IDispatch, Res)=S_OK;
    end;
begin
 For i:=0 to 2 do
   if CheckClass(Engines[i]) then
     begin
       DAO := CreateOleObject(Engines[i]);
       DAO.Workspaces[0].CreateDatabase(filename, ';LANGID=0x0409;CP=1252;COUNTRY=0', 32);
       exit;
     end;
 Raise Exception.Create('DAO engine could not be initialized');
end;


Кусочек кода, который должен распознавать какая версия DAO установлена на компьютере мной не мог быть оттестирован, так как только одна работающая версия DAO может быть установлена на компьютере. У меня установлен Office XP (DAO36) и на нем все работает нормально. Интересно было бы узнать работает ли логика для Office 2000 (DAO35) и Office 97 (DAO30), так что присылайте отзывы, или может кто знает лучший способ как определить версию DAO (кроме моего, установки нескольких try .. except, поиска по диску DAOxx.DLL)

Автор: Fantasist 1.4.2002, 07:08
Это здорово! Тут, помниться, TAРАКАН cпрашивал, как создать базу данных Access тогда, по моему, так и не ответели.

А какой параметр указывает, что именно база данных Access?
LANGID=0x0409 - этот что ли? (не довелось пока с DAO поработать)

В принципе CoCreateInstance, можно заменить на поиск по реестру, возможно будет эффективнее.

Автор: Vit 1.4.2002, 07:32
Цитата

Это здорово! Тут, помниться, TAРАКАН cпрашивал, как создать базу данных Access тогда, по моему, так и не ответели.


Вообще-то я отвечал, правда и не настолько конкретно. Тепрерь же решил воплатить теорию в код.

Цитата

А какой параметр указывает, что именно база данных Access?
LANGID=0x0409 - этот что ли? (не довелось пока с DAO поработать)


Нет, это языковые настройки, как я понял. Насколько я понимаю просто для DAO MS Access это стандарт, и она и создается по умолчанию, все остальные базы - работают через какой-то "ретрансляционный layer" внутри DAO и не имеется возможности достучаться до таких мелочей. Впрочем импортируй в модуль DAOxx.DLL (где-то в микрософтовских Common Files) и сам посмотри ее интерфейсы.

Цитата

В принципе CoCreateInstance, можно заменить на поиск по реестру, возможно будет эффективнее

Не было времени разглядывать пристально, но кое-что меня озадачило: у меня стоит Office XP т.е. DAO36, так вот у меня есть обе DAO36.DLL и DAO35.DLL, и в реестре в HKEY_CLASSES_ROOT прописаны оба CLSID, но инициализируется только один(DAO36)! Другой (DAO35) дает ошибку при попытке инициализации. Вот и пойми, как определить?

Автор: Fantasist 1.4.2002, 08:03
Цитата
Нет, это языковые настройки, как я понял


А, ну да. Логично. LANGID - мог бы и сам догадаться...



Цитата
Не было времени разглядывать пристально, но кое-что меня озадачило: у меня стоит Office XP т.е. DAO36, так вот у меня есть обе DAO36.DLL и DAO35.DLL, и в реестре в HKEY_CLASSES_ROOT прописаны оба CLSID, но инициализируется только один(DAO36)! Другой (DAO35) дает ошибку при попытке инициализации. Вот и пойми, как определить?


Хм! Очень интересно. Конечно, неплохо бы знать, на каком уровне происходит ошибка. Посмотрю у себя, но если ты все-таки найдешь время разшлядеть хоть чего-нибудь, раскажешь ok?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)