Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > ADOQuery, ADOConnection Win7Sp1, Win8 не работает


Автор: Illusion Dolphin 28.12.2012, 22:16
Есть приложение, использующее TADOQuery и TADOConnection для доступа к базе данных (создание базы и запросы). 
В качестве провайдера автоматически выбирается один из списка: jet4.0, ACE 12 или ACE 14 в зависимости от того, какой имеется на машине. 
Проблема в том, что на некоторых машинах (Windows7, Win8) что-то происходит и это не работает. Самая большая загвоздка что я не знаю ошибки, и поспроивести её не могу на всех доступных все машинах. 

Раньше я создавал базу данных с помощью кода:
Код

procedure CreateMSAccessDatabase(FileName: string);
var
  DAO,
  WS: Variant;
  I,
  Code: Integer;
  ErrorString: string;
  const Engines: array[0..3] of string = ('DAO.DBEngine.120', 'DAO.DBEngine.36', 'DAO.DBEngine.35', 'DAO.DBEngine');

  function CheckClass(OLEClassName: string): Boolean;
  var
    HR: HResult;
    G: TGUID;
    I: IInterface;
  begin
    HR := CLSIDFromProgID(PWideChar(WideString(OLEClassName)), G);

    if Failed(HR) then
      Exit(False);

    HR := CoCreateInstance(G, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IDispatch, I);
    Result := HR = S_OK;
  end;

begin
  Code := 0;
  for I := Low(Engines) to High(Engines) do
    if CheckClass(Engines[I]) then
      begin
        try
          DAO := CreateOleObject(Engines[I]);
          Code := 1;
          WS := DAO.Workspaces[0];
          Code := 2;
          WS.CreateDatabase(FileName, ';LANGID=0x0409;CP=1252;COUNTRY=0', 64);
          Exit;
        except
          on E: Exception do
          begin
            ErrorString := 'Error creating database! Engine: ' + Engines[I] + ', ERROR: ' + E.message + ', file: ' + FileName + ', code = ' + IntToStr(Code);
            EventLog(ErrorString);
            TThread.Synchronize(nil,
              procedure
              begin
                MessageBoxDB(0, ErrorString, TA('Error'), TD_BUTTON_OK, TD_ICON_ERROR);
              end
            );
          end;
        end;
      end;
  raise Exception.Create('DAO engine could not be initialized');
end;


В результате пользователь получал ошибку с кодом 1,  E.message = "Ошибка загрузки библиотеки" (русская винда была у пользователя). Т.е. падала строка WS := DAO.Workspaces[0]; 
Было решено отказаться от такого "сложного" кода и для создания базы просто копировать заготовку из ресурсов.

Но это видно не решило проблему (судя по небольшим отчётам программы, деталей нету). 

Нашёл статьи про проблему с ADO в SP1:
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13

Кто-нибудь сталкивался с проблемой? Посоветуйте что-нибудь, пожалуйста smile

Автор: lomaster 28.12.2012, 22:32
Для создания/редактирования баз програмно лучше использовать ADOX.
А что не получилось с ресурсами?

Автор: Illusion Dolphin 29.12.2012, 00:39
Цитата

А что не получилось с ресурсами? 

Всё получилось, ошибки там явно нету, но всё равно что-то не так - возможно ошибка в TADOQuery и TADOConnection, вот о них и спрашиваю smile

Цитата

Для создания/редактирования баз програмно лучше использовать ADOX.

Мне казалось что TADO* использует те же интерфейся, разве не так?

Автор: lomaster 29.12.2012, 12:38
Цитата

Мне казалось что TADO* использует те же интерфейся, разве не так? 
 Нет, ADOX это расширение ADO, в них все свое.

Автор: Illusion Dolphin 30.12.2012, 11:05
Цитата

Для создания/редактирования баз програмно лучше использовать ADOX.

Я бы так и поступил, если бы получил подтверждение, что проблема из-за этого. А просто переделывать кучу кода без никаких гарантий улучшения и возможности наткнуться на проблемы - это слишком.

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