程序连接服务器上的数据库,在网不通的时候暂时把数据存在本地,当网通的时候通过线程上传到服务器上,利用多线程保证上传过程中能同时进行其他的操作。但是我写的线程不知道怎么回事,只要一连接服务器他就必须要等待上传结束了才能进行其他的操作。本人对线程不是很了解,不知道那出错了。看了很多帖子,说是数据库的多线程操作,需要另外的adoconnection,但是还是不行。
附代码,大家帮帮忙。
线程代码:
unit Uthread;interfaceuses
  Classes,ADODB,SysUtils,Dialogs;type
  mythread = class(TThread)
  private
     fstrdwbh:string;
     fintsonid :Integer;
  fintpgid :Integer;
    { Private declarations }
  protected
    procedure Execute; override;
  Public
    constructor Create(adoconn1:Tadoconnection);
  procedure  updatapginfo(); //上传的数据
  procedure  updatapggaoji();//上传的数据
  procedure  updatapgcz();//上传的数据
  procedure  updatapgcxl();//上传的数据
  procedure  updatapgry();//上传的数据
  procedure aa();
  end;implementation
uses Udm,Uglb,pginfo,main;
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure update.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }{ update }constructor mythread.Create(adoconn1:Tadoconnection);
begin
 inherited Create(True);
    //连接服务器数据库
    if adoconn1.Connected then adoconn1.Connected := false;
    adoconn1.CommandTimeout := 15;
    adoconn1.ConnectionTimeout := 15;
    adoconn1.ConnectionString := '';
    adoconn1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' + Gnetpwd
      + ';Persist Security Info=True;User ID=' + Gnetuser + ';Initial Catalog=jcpg;Data Source=' + #39 + Gsjsqlid + #39;
  //   try
      adoconn1.Connected := true;
 //    except //    end;
//
end;procedure mythread.Execute;
begin  Synchronize(aa);end;procedure  mythread.updatapginfo();
var
 str,strsj:string;
begin
    str := 'select * from pg_info where dwbh=''' + Gdwbh + ''' and sonid='
      + inttostr(fintsonid) + '  and pgid=' + inttostr(fintpgid);
    adoqopen(frmmain.adoq1, str);
    //省局端添加
    strsj := 'select * from pg_info ';
    adoqopen(frmmain.adoq2, strsj);
    frmmain.adoq2.Append;
    frmmain.adoq2.FieldByName('dwbh').AsString := Gdwbh;
    frmmain.adoq2.FieldByName('sonid').AsInteger := fintsonid;
    frmmain.adoq2.FieldByName('pgid').AsInteger := fintpgid;
    frmmain.adoq2.FieldByName('pgwh').AsString := frmmain.adoq1.FieldByName('pgwh').AsString;
    frmmain.adoq2.FieldByName('cllx').AsString := frmmain.adoq1.FieldByName('cllx').AsString;
    frmmain.adoq2.FieldByName('hphm').AsString := frmmain.adoq1.FieldByName('hphm').AsString;
    frmmain.adoq2.FieldByName('fdjh').AsString := frmmain.adoq1.FieldByName('fdjh').AsString;
    frmmain.adoq2.FieldByName('cjh').AsString := frmmain.adoq1.FieldByName('cjh').AsString;
    frmmain.adoq2.FieldByName('color').AsString := frmmain.adoq1.FieldByName('color').AsString;
    frmmain.adoq2.FieldByName('xslc').AsInteger := frmmain.adoq1.FieldByName('xslc').AsInteger;
    frmmain.adoq2.FieldByName('djrq').AsString :=formatdatetime('yyyy-mm-dd',frmmain.adoq1.FieldByName('djrq').AsDateTime);
    frmmain.adoq2.FieldByName('syxz').AsString := frmmain.adoq1.FieldByName('syxz').AsString;
    frmmain.adoq2.FieldByName('pgjzrq').AsString :=formatdatetime('yyyy-mm-dd',frmmain.adoq1.FieldByName('pgjzrq').AsDateTime);
    frmmain.adoq2.FieldByName('pgckjg').AsInteger := frmmain.adoq1.FieldByName('pgckjg').AsInteger;
    frmmain.adoq2.FieldByName('czr').AsString := frmmain.adoq1.FieldByName('czr').AsString;
    frmmain.adoq2.FieldByName('pgrq').AsString :=formatdatetime('yyyy-mm-dd',frmmain.adoq1.FieldByName('pgrq').AsDateTime);
    frmmain.adoq2.FieldByName('zsynx').AsInteger := frmmain.adoq1.FieldByName('zsynx').AsInteger;
    frmmain.adoq2.FieldByName('czjg').AsInteger := frmmain.adoq1.FieldByName('czjg').AsInteger;
    frmmain.adoq2.FieldByName('clcp').AsString := frmmain.adoq1.FieldByName('clcp').AsString;
    frmmain.adoq2.FieldByName('clxh').AsString := frmmain.adoq1.FieldByName('clxh').AsString;
    frmmain.adoq2.FieldByName('picfile').AsString := frmmain.adoq1.FieldByName('picfile').AsString;
    frmmain.adoq2.FieldByName('zlmc').AsString := frmmain.adoq1.FieldByName('zlmc').AsString;
    frmmain.adoq2.FieldByName('pgmd').AsString := frmmain.adoq1.FieldByName('pgmd').AsString;
    frmmain.adoq2.FieldByName('pgf').AsInteger := frmmain.adoq1.FieldByName('pgf').AsInteger;
    frmmain.adoq2.FieldByName('clxl').asstring := frmmain.adoq1.FieldByName('clxl').AsString;
    frmmain.adoq2.post;
    frmmain.adoq2.Close;
    frmmain.adoq1.Close;
end;

解决方案 »

  1.   

    procedure  mythread.updatapggaoji();
    var
      strsj: string; //server
      str: string; //本地
    begin
        str := 'select * from pg_gaoji where dwbh=''' + Gdwbh + ''' and sonid='
          + inttostr(fintsonid) + '  and pgid=' + inttostr(fintpgid);
        adoqopen(frmmain.adoq1, str);
        //省局
        strsj := 'select * from pg_gaoji';
        adoqopen(frmmain.adoq2, strsj);
        frmmain.adoq2.Append;
        frmmain.adoq2.FieldByName('dwbh').AsString := Gdwbh;
        frmmain.adoq2.FieldByName('sonid').AsInteger := fintsonid;
        frmmain.adoq2.FieldByName('pgid').AsInteger := fintpgid;
        frmmain.adoq2.FieldByName('jgdy').AsString := frmmain.adoq1.FieldByName('jgdy').AsString;
        frmmain.adoq2.FieldByName('pgyj').AsString := frmmain.adoq1.FieldByName('pgyj').AsString;
        frmmain.adoq2.FieldByName('xdtj').AsString := frmmain.adoq1.FieldByName('xdtj').AsString;
        frmmain.adoq2.FieldByName('sm').AsString := frmmain.adoq1.FieldByName('sm').AsString;
        frmmain.adoq2.FieldByName('pgyz').AsString := frmmain.adoq1.FieldByName('pgyz').AsString;
        frmmain.adoq2.FieldByName('pgff').AsString := frmmain.adoq1.FieldByName('pgff').AsString;
        frmmain.adoq2.FieldByName('jszk').AsString := frmmain.adoq1.FieldByName('jszk').AsString;
        frmmain.adoq2.Post;
        frmmain.adoq2.Close;
        frmmain.adoq1.Close;
    end;procedure  mythread.updatapgcz();
    var
      strsj: string; //server
      str: string; //本地
    begin
        str := 'select * from pg_cz where dwbh=''' + Gdwbh + ''' and sonid='
          + inttostr(fintsonid) + '  and pgid=' + inttostr(fintpgid);
        adoqopen(frmmain.adoq1, str);
        //省局
        strsj := 'select * from pg_cz';
        adoqopen(frmmain.adoq2, strsj);
        frmmain.adoq2.Append;
        frmmain.adoq2.FieldByName('dwbh').AsString := Gdwbh;
        frmmain.adoq2.FieldByName('sonid').AsInteger := fintsonid;
        frmmain.adoq2.FieldByName('pgid').AsInteger := fintpgid;
        frmmain.adoq2.FieldByName('czm').AsString := frmmain.adoq1.FieldByName('czm').AsString;
        frmmain.adoq2.FieldByName('czbz').AsString := frmmain.adoq1.FieldByName('czbz').AsString;
        frmmain.adoq2.FieldByName('bm').AsString := frmmain.adoq1.FieldByName('bm').AsString;
        frmmain.adoq2.FieldByName('phone').AsString := frmmain.adoq1.FieldByName('phone').AsString;
        frmmain.adoq2.FieldByName('addr').AsString := frmmain.adoq1.FieldByName('addr').AsString;
        frmmain.adoq2.Post;
        frmmain.adoq2.Close;
        frmmain.adoq1.Close;
    end;procedure  mythread.updatapgcxl();
    var
      strsj: string; //server
      str: string; //本地
    begin
        str := 'select * from pg_cxl where dwbh=''' + Gdwbh + ''' and sonid='
          + inttostr(fintsonid) + '  and pgid=' + inttostr(fintpgid);
        adoqopen(frmmain.adoq1, str);    strsj := 'select * from pg_cxl';
        adoqopen(frmmain.adoq2, strsj);
        frmmain.adoq2.Append;
        frmmain.adoq2.FieldByName('dwbh').AsString := Gdwbh;
        frmmain.adoq2.FieldByName('sonid').AsInteger := fintsonid;
        frmmain.adoq2.FieldByName('pgid').AsInteger := fintpgid;
        frmmain.adoq2.FieldByName('bjcxl').AsString := frmmain.adoq1.FieldByName('bjcxl').AsString;
        frmmain.adoq2.FieldByName('fbcxl').AsString := frmmain.adoq1.FieldByName('fbcxl').AsString;
        frmmain.adoq2.FieldByName('rgcxl').AsString := frmmain.adoq1.FieldByName('rgcxl').AsString;
        frmmain.adoq2.FieldByName('zjscxl').AsString := frmmain.adoq1.FieldByName('zjscxl').AsString;
        frmmain.adoq2.FieldByName('llcxl').AsString := frmmain.adoq1.FieldByName('llcxl').AsString;
        frmmain.adoq2.FieldByName('jsfs').AsString := frmmain.adoq1.FieldByName('jsfs').AsString;
        frmmain.adoq2.Post;
        frmmain.adoq2.Close;
        frmmain.adoq1.Close;end;procedure  mythread.updatapgry();
    var
      strsj: string; //server
      str: string; //本地
    begin
        str := 'select * from pg_ry where dwbh=''' + Gdwbh + ''' and sonid='
          + inttostr(fintsonid) + '  and pgid=' + inttostr(fintpgid);
        adoqopen(frmmain.adoq1, str);    strsj := 'select * from pg_ry';
        adoqopen(frmmain.adoq2, strsj);
        frmmain.adoq2.Append;
        frmmain.adoq2.FieldByName('dwbh').AsString := Gdwbh;
        frmmain.adoq2.FieldByName('sonid').AsInteger := fintsonid;
        frmmain.adoq2.FieldByName('pgid').AsInteger := fintpgid;
        frmmain.adoq2.FieldByName('rybh').asinteger := frmmain.adoq1.FieldByName('rybh').asinteger;
        frmmain.adoq2.FieldByName('zgzh').AsString := frmmain.adoq1.FieldByName('zgzh').AsString;
        frmmain.adoq2.FieldByName('name').AsString := frmmain.adoq1.FieldByName('name').AsString;
        frmmain.adoq2.FieldByName('zjmc').AsString := frmmain.adoq1.FieldByName('zjmc').AsString;
        frmmain.adoq2.Post;
        frmmain.adoq2.Close;
        frmmain.adoq1.Close;
    end;
    procedure mythread.aa();
    var
      str:string;
     // adoq,adoq1,adoq2:Tadoquery;
      i:integer;
    begin
      i:=0;
        str:='SELECT pg_info.dwbh,pg_info.sonid, pg_info.pgid, pg_info.pgwh, pg_info.hphm,'
      +' pg_info.fdjh, pg_info.cjh, pg_info.color, pg_info.xslc, pg_info.djrq as djrq,'
      +' pg_info.syxz, pg_info.pgjzrq as pgjzrq, pg_info.pgckjg,'
      +' pg_info.czr, pg_info.pgrq as pgrq,'
      +' pg_info.czjg, pg_info.clcp,pg_info.clxl,pg_info.clxh, pg_cz.czm, pg_cz.bm, pg_cz.addr,'
      +' pg_cz.phone,pg_info.picfile FROM pg_info, pg_cz WHERE (((pg_info.dwbh)=[pg_cz].[dwbh])'
      +' and ((pg_info.sonid)=[pg_cz].[sonid]) AND ((pg_info.pgid)=[pg_cz].[pgid]))'
      +' and pg_info.scbz=0';  adoqopen(frmmain.adoq1,str);
     // showmessage(inttostr(frmmain.adoq1.RecordCount));
      if not frmmain.adoq1.IsEmpty then
      begin
        for i := 0 to frmmain.adoq1.RecordCount - 1 do
        begin
      fstrdwbh := Gdwbh;
      fintsonid := frmmain.adoq1.fieldbyname('sonid').AsInteger;
      fintpgid := frmmain.adoq1.fieldbyname('pgid').AsInteger;
        //上报pg_info
       updatapginfo();
        //上报pg_gaoji
        updatapggaoji();
       //上报pg_cz
        updatapgcz();
        //上报pg_jcxm
      //  updatapgjcxm(adoq1,adoq2);
         //上报pg_cxl
        updatapgcxl();
        //上报pg_qtxm
       { updatapgqtxm(adoq1,adoq2);
        //
         updatapgfb(adoq1,adoq2);
        ////上报pg_dw
        updatapgdw(adoq1,adoq2);  }
        ////上报pg_ry
        updatapgry();
        end;
       end;
    end;end.每天中午12点检测网是否通,这个时候调用线程,放了一个timer
    调用代码如下:
    procedure Tfrmmain.Timer1Timer(Sender: TObject);
    var
     str:string;
     TH:mythread;
    begin
       str:=formatdatetime('hh:mm',now);
     if str='12:00' then
     begin
    //到12点唤醒线程
      try
        TH:=mythread.Create(ADOConnet);
        TH.Priority := tpNormal;
        TH.FreeOnTerminate := true;
        TH.Resume;
      except
       // TH.Terminate;  end;
     end;
    end;另外问一下,如果检测的时候,网不通,怎么退出这个线程?
      

  2.   

    问题1,去掉Synchronize,直接调用aa试试:
    procedure mythread.Execute;
    begin
      aa();
    end;
    问题2:
    if 网不通 then
    begin
      TH.Suspend;
      TH.Free;
    end;