Ошибка DBX: не удалось правильно инициализировать драйвер при использовании OmniThreadLibrary (но в противном случае все в порядке) - PullRequest
2 голосов
/ 11 февраля 2012

Мне нужно сделать долгосрочную задачу в фоновом режиме.Я использую 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, получите ошибку.Что здесь происходит?

1 Ответ

7 голосов
/ 11 февраля 2012

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

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.

...