unit UClearthread;interfaceuses
  Windows, Messages,Classes, DB,Forms, ADODB,SysUtils;type
  ClearThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;implementation
uses
   Umain,UInfo;
procedure ClearThread.Execute;
var
   SqlStr,sDate,str:String;
   qryClear:TADOQuery;
begin
    qryClear.Create(nil);       //运行至此就报错,为什么?try
....
   SqlStr:="";....
   if qryClear.Active then
      qryClear.Close;
   qryClear.ConnectionString:=frmMain.ConnStr;
   qryClear.SQL.Clear;
   qryClear.SQL.Add(SqlStr);
      try
       qryClear.Open;
     except
       qryClear.Close;
       Application.MessageBox('打开数据库错误!','错误信息',MB_OK + MB_ICONSTOP);
       Application.Terminate;
     end;
  end;
finally
  qryClear.Free;
end; end;end.

解决方案 »

  1.   

    qryClear := TADOQuery.Create(nil);
      

  2.   

    应该改为:  qryClear:=TADOQuery.Create(nil);
      try
         some stament
      finally
        qryClear.Free;
      end;
      

  3.   

    还是不行,提示"尚未调用Coinitialize"
      

  4.   

    // 在 uses 中加入 ActiveX 单元, 下面代码以供参考.
    unit UClearthread;interfaceuses
      Windows, Messages,Classes, DB, Forms, ADODB,SysUtils;type
      ClearThread = class(TThread)
      private
        { Private declarations }
        FConnStr: String;
        FSuccess: Boolean;
      protected
        procedure Execute; override;
      public
        constructor Create(AConnStr: String);    // 是否运行成功
        property IsSuccess: Boolean read FSuccess;
      end;implementationuses
       UInfo, ActiveX;
    constructor ClearThread.Create(AConnStr: String);
    begin
       FConnStr := AConnStr;
       FSuccess := False;   inherited Create(False);
    end;
    procedure ClearThread.Execute;
    var
       SqlStr,sDate,str:String;
       qryClear:TADOQuery;
    begin
       // ADO 的初始化
       CoInitialize(nil);
       try
          qryClear := TADOQuery.Create(nil);
          try
             // ... ...
             SqlStr:="";
             // ... ...         qryClear.Close;
             qryClear.ConnectionString := FConnStr;
             qryClear.SQL.Clear;
             qryClear.SQL.Add(SqlStr);
             qryClear.Open;
             FSuccess := True;
          finally
             qryClear.Close;
             qryClear.Free;
          end;
       except
       end;   // ADO 的释放
       CoUninitialize;
    end;end.
      

  5.   

    unit UClearthread;interfaceuses
      Windows, Messages,Classes, DB,Forms, ADODB,SysUtils;type
      ClearThread = class(TThread)
      private
        { Private declarations }
      protected
        procedure OneProgress;
        procedure Execute; override;
      end;implementation
    uses
       Umain,UInfo;
    procedure ClearThread.Execute;
    begin
      Synchronize(OneProgress);
    end;procedure OneProgress;
    var
       SqlStr,sDate,str:String;
       qryClear:TADOQuery;
    begin
        qryClear.Create(nil);   try
    ....
       SqlStr:="";....
       if qryClear.Active then
          qryClear.Close;
       qryClear.ConnectionString:=frmMain.ConnStr;
       qryClear.SQL.Clear;
       qryClear.SQL.Add(SqlStr);
          try
           qryClear.Open;
         except
           qryClear.Close;
           Application.MessageBox('打开数据库错误!','错误信息',MB_OK + MB_ICONSTOP);
           Application.Terminate;
         end;
    end;finally
      qryClear.Free;
    end; end;end.
      

  6.   

    因為在 Execute 中不能用其它窗體上的控件或自定控件義隻能用一些函數,所以要自定一個函數在用 Synchronize 調用即可。