DBX错误:使用OmniThreadLibrary时无法正确初始化驱动程序(但是不然)

时间:2012-02-11 18:33:35

标签: multithreading delphi delphi-xe2 dbexpress

我需要在后台执行一项长时间运行的任务。我正在使用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 个答案:

答案 0 :(得分:7)

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

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的帮助,请参阅   MSDN上的CoInitialize功能。