multithreading - DBX错误: Driver could not be properly initialized when use OmniThreadLibrary (but ok otherwise)

标签 multithreading delphi delphi-xe2 dbexpress

我需要在后台执行一个长时间运行的任务。我正在使用OmniThreadLibrary希望这可以帮助我。

我使用dbexpress+mssql驱动程序。当在主线程中时我可以正常连接,但是得到:

Project Project1.exe raised exception class TDBXError with message 'DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path.'.

连接是在每个线程中创建的,而不是共享数据模块:

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;

如果我直接执行这个,打开就ok了。如果我使用 Parallel.Async 则会出现错误。这里发生了什么?

最佳答案

我在这里找到了相关信息:

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

MSSQL Driver Requires Calls to CoInitialize and CoUninitialize for Console Applications and Worker Threads

The MSSQL driver does not call CoInitialize or CoUninitialize. Earlier versions of the MSSQL driver, which is a COM driver, called CoInitialize and CoUninitialize directly, which is not a good practice. VCL applications take care of these calls for you, so VCL applications do not require calling CoInitialize and CoUninitialize. However, applications using the MSSQL driver in console applications or in worker threads need to call CoInitialize/CoUninitialize. If this call is not made, you will see the following error message: "DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path." For help on CoInitialize, see the CoInitialize Function on MSDN.

关于multithreading - DBX错误: Driver could not be properly initialized when use OmniThreadLibrary (but ok otherwise),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242890/

相关文章:

delphi - 使用 FinalBuilder 和 AQTime 获取 DUnit 测试覆盖率统计信息

delphi - VirtualTreeView:编辑下一列

delphi - TVirtualTreeView 具有可变高度的行 : scrolling artefacts

Delphi Xe2 与 Firemonkey : Can you have a non-client area that is painted in a style other than the default Windows nonclient paint style?

C++ 线程没有像我预期的那样工作?

java - 从使用线程的另一个类检索 String 时出现问题

delphi - 使用外键时创建表语句中的语法错误

如果您使用样式,Delphi TListView DoubleBuffered 不起作用

java线程同步问题

ios - OS X 上的 GCD 死锁,但 iOS 上没有