CoInitialize错误使用线程内的数据库

ria*_*iad 4 database delphi multithreading ado delphi-7

使用Delphi 7,每当我尝试在线程内部进行任何数据库工作时,我都会收到此错误:

"CoInitialize尚未被称为"

我在线程中使用了一个包含ADOConnection.Open的简单代码.

但是,如果它以任何形式使用,相同的代码工作正常吗?

pf1*_*957 14

@mjn:我不允许在上一个答案中评论你的评论,所以我创建了一个新答案:从构造函数中调用CoInitialize是典型的错误程序员之一.

构造函数在另一个线程的上下文中执行,但是您需要在当前线程上初始化COM(当线程过程正在运行时,即作为Execute方法的一部分),请参阅

  • +1:绝对正确.我很难学会这一点. (4认同)

bum*_*mmi 10

procedure TYourThread.execute;
begin
  CoInitialize(nil); 
  FConnection:=TConnection.Create(...);
  try
    ThreadCode ....
  finally
    FConnection.free;
    CoUninitialize;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • @mjn我写的关于threadcontext的评论是因为我不同意评论:"CoInitialize/CoUninitialize可以在线程构造函数/析构函数中调用" (3认同)
  • @mjn,您是否在子类化的`TThread.Create`中测试了`GetCurrentThreadId = MainThreadId`?`TThread`构造函数总是在调用线程的上下文中执行. (2认同)