unit Mythread;interfaceuses
  Windows,shlobj,Forms, Classes, dialogs,SysUtils, ADODB, DBXpress, DB, SqlExpr, FMTBcd,Definition;type
  Ttransfer = class(TThread)
  private
    padoconnection : TAdoConnection;
    padoquery : TADOQuery;
    psqlconnection :Tsqlconnection;
    psqlquery : Tsqlquery;
    psqlupdate : Tsqlquery;  protected
    procedure Execute;override;
  public
    constructor Create;
    destructor Destroy; override;   
  end;var
   mytransfer : Ttransfer;
implementationconstructor Ttransfer.Create;
begin
  padoconnection := TAdoConnection.Create(nil);
  padoconnection.ConnectionString := 'Provider=MSDAORA.1;Password='+ora_pwd+';User ID='+ora_user+';Data Source='+ora_db+';Persist Security Info=True';
  padoconnection.LoginPrompt := false;
  padoquery := TADOQuery.Create(nil);
  padoquery.Connection := padoconnection;
  psqlconnection := Tsqlconnection.Create(nil);
  psqlconnection.ConnectionName :='MySQLConnection';
  psqlconnection.DriverName :='MySQL';
  psqlconnection.GetDriverFunc :='getSQLDriverMYSQL';
  psqlconnection.LibraryName :='dbexpmysql.dll';
  psqlconnection.VendorLib := 'libmysql.dll';
  psqlconnection.LoginPrompt := false;  psqlconnection.Params.Values['DriverName'] := 'MySQL' ;
  psqlconnection.Params.Values['hostname'] := mysql_host ;
  psqlconnection.Params.Values['user_name'] := mysql_user ;
  psqlconnection.Params.Values['database'] := mysql_db ;
  psqlconnection.Params.Values['password'] := mysql_pwd ;
  psqlconnection.Params.Values['Blobsize'] := '-1' ;
  psqlconnection.Params.Values['ErrorResourceFile'] := '' ;
  psqlconnection.Params.Values['Localecode'] := '0000' ;
 // psqlconnection.Open;  psqlquery := Tsqlquery.Create(nil);
  psqlquery.SQLConnection := psqlconnection;
  psqlupdate := Tsqlquery.Create(nil);
  psqlupdate.SQLConnection := psqlconnection;
  FreeOnTerminate := false;
  inherited Create(false);            //false 立刻运行
  Priority := tpLowest;              //线程等级
end;destructor Ttransfer.Destroy;
begin
  padoquery.Close;
  padoquery.Free;
  padoconnection.Free;
  psqlquery.Close;
  psqlupdate.Close;
  psqlquery.Free;
  psqlupdate.Free;
  psqlconnection.Free;  inherited;
end;procedure Ttransfer.Execute;procedure uploadkq ;             // 线程的主要任务 
var
 rowcount,i,num: integer;
 tm,rqsj,id ,cybz  : string;
begin
     num := 0;     with psqlquery do
     begin       sql.Clear;
       sql.Add('select * from kq where flag=0');
       open;
       rowcount := RecordCount;
       First;       for i:= 1  to rowcount do
       begin
         id := FieldByName('id').AsString;
         tm := FieldByName('tm').AsString;
         rqsj :=  FieldByName('rqsj').AsString;
         cybz :=  FieldByName('cybz').AsString;
         with padoquery do
             begin             sql.Clear;
             sql.Add('insert into kq(tm,rqsj,cybz)');
             sql.Add(' values('''+tm+''','''+rqsj+''','''+cybz+''')');
             Execsql;
             inc(num);
             end;         with psqlupdate do
         begin            sql.Clear;
            sql.Add('update kq set flag=''1'' where id='+id);            Execsql;
         end;
       Next;
     end;
    end; //    scnum := num ;end;
begin
 while not Terminated do
    begin
      uploadkq;    // 线程的主要任务
      Sleep(2000);
    end;
end;
initialization
begin
//CoInitialize(nil);end;end.

解决方案 »

  1.   

    我在运行程序时报错:"尚未调用CoInitialize"
      

  2.   

    在padoquery := TADOQuery.Create(nil);之前调用CoInitialize;uses ActiveX
      

  3.   

    如果是用的ado,必须调用coninitialize,这是com组件必须的。
      

  4.   

    在execute第一句调用coinitialize.提醒一下:你ado控件的创建和使用是在不同的线程中(创建在主线程,使用在子线程)
      

  5.   

    在线程中调用了ADO组件方法,若要实现调用必须要对所调用的interface进行整理。就像MIDAS中线程模式那样。
        coinitialize就是接口整理前的一项准备工作。
      

  6.   

    问题应该处在工程文件中,
    调用Application.Initialize;
    就可以了,这里会去调用各个单元的初始化代码。
      

  7.   

    嗯,我经常见的,一般是ADOCONNECTION没打开...我以前就经常犯这外错误,哈哈..
    没看楼主的代码,说错了别见怪。
      

  8.   

    1.在你调用线程的时候要初始化下CoInitialize以及UCoInitialize
      procedure MyDBThread.Execute;
    begin
         CoInitialize( nil );
             //你的代码
         CoUnInitialize;
    end;
    2.在UESE里面添加ActiveX
    ADO必须这样做