Ошибка DBX: драйвер не может быть правильно инициализирован при использовании OmniThreadLibrary (но в остальном все в порядке)

Мне нужно сделать длительную задачу в фоновом режиме. Я использую OmniThreadLibrary, надеюсь, это может мне помочь.

Я использую драйвер dbexpress+mssql. Я могу подключиться нормально, когда в основном потоке, но получаю:

Project Project1.exe поднял класс исключения TDBXError с сообщением «Ошибка DBX: драйвер не может быть правильно инициализирован. Клиентская библиотека может отсутствовать, быть неправильно установленной, неверной версии или драйвер может отсутствовать в системном пути.'.

Соединения создаются в каждом потоке, а не в общем модуле данных:

type
  TdbManager = class(TObject)
  private
    { private declarations }
    FCon: TSQLConnection;
  public
    { public declarations }
    procedure Open(Driver:String; aparams:TStringList);overload;
    procedure Close;

    constructor Create;
    destructor Destroy;override;
  end;

  constructor TdbManager.Create;
begin
  inherited Create;
  FCon := TSQLConnection.Create(nil);
end;

procedure TdbManager.Open(Driver: String; aparams: TStringList);
var
  i: Integer;
  key:string;
begin
  FCon.DriverName := Driver;

  for i := 0 to params.Count - 1 do
  begin
    key := params.Names[i];
    FCon.Params.Values[key] := params.Values[key];
  end;

  LogMsg('Open DB '+ Driver + ': ' + FHost + '\' + FDatabase);

  FCon.Open;
  LogMsg('Done.');
end;

И выполняется фоновая задача:

procedure TBackupPlan.OnScheduleTrigger(Sender: TScheduledEvent);
begin
  Parallel.Async(procedure
  begin
    ExecuteDataTask( Sender.Name );
  end);
end;

procedure TBackupPlan.ExecuteDataTask(const Name: String);
var
  db:TdbManager;
begin
  db := nil;

  db := TSqlServerManager.Create;
  db.Open(self.Driver, options);

  result := db;
end;

Если я выполню это напрямую, откройте ок. Если я использую Parallel.Async, то получаю ошибку. Что здесь произошло?


person mamcx    schedule 11.02.2012    source источник


Ответы (1)


Я нашел информацию об этом здесь:

http://docwiki.embarcadero.com/RADStudio/en/DbExpress_Database_Specific_Information

Драйверу MSSQL требуются вызовы CoInitialize и CoUninitialize для консольных приложений и рабочих потоков

Драйвер MSSQL не вызывает CoInitialize или CoUninitialize. Более ранние версии драйвера MSSQL, который является драйвером COM, напрямую вызывали CoInitialize и CoUninitialize, что не рекомендуется. Приложения VCL позаботятся об этих вызовах за вас, поэтому приложения VCL не требуют вызова CoInitialize и CoUninitialize. Однако приложения, использующие драйвер MSSQL в консольных приложениях или в рабочих потоках, должны вызывать CoInitialize/CoUninitialize. Если этот вызов не будет выполнен, вы увидите следующее сообщение об ошибке: «Ошибка DBX: драйвер не может быть правильно инициализирован. Возможно, клиентская библиотека отсутствует, установлена ​​неправильно, неправильной версии или драйвер может отсутствовать в системе. дорожка." Справку по CoInitialize см. в разделе Функция CoInitialize на сайте MSDN.

person mamcx    schedule 11.02.2012