程序连接服务器上的数据库,在网不通的时候暂时把数据存在本地,当网通的时候通过线程上传到服务器上,利用多线程保证上传过程中能同时进行其他的操作。但是我写的线程不知道怎么回事,只要一连接服务器他就必须要等待上传结束了才能进行其他的操作。本人对线程不是很了解,不知道那出错了。看了很多帖子,说是数据库的多线程操作,需要另外的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;
附代码,大家帮帮忙。
线程代码:
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;
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;另外问一下,如果检测的时候,网不通,怎么退出这个线程?
procedure mythread.Execute;
begin
aa();
end;
问题2:
if 网不通 then
begin
TH.Suspend;
TH.Free;
end;