我需要在后台执行一项长时间运行的任务。我正在使用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
,则会收到错误消息。这里发生了什么?
答案 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功能。