ado接数据库在打开时候出错了!eoleexception连接失败!! 为什么?(68分)

  • 主题发起人 主题发起人 yjwnnit
  • 开始时间 开始时间
Y

yjwnnit

Unregistered / Unconfirmed
GUEST, unregistred user!
我建了两个ADOCONNECTION连接, 一个是连本地SQLSERVER数据库,另一个是连远程数据库。


实现的功能是这样, 建一个TIMER 用于按本地数据库表中的计划时间来将远程数据库的几个表读取出来插入本地数据库。 就在这个时候我用到了别一个TIMER控件再建了一个线程,该线程用于定时每隔10秒测试一下两个ADO联接是何通。


运行结果, 当没有本地数据库向远程数据库取数进行插入操作的时候,手工断开SQL SERVER 然后手工恢复一切都正常; 但当有远程数据库更新本地数据库更新的时候就会出现以下的测试线程错误:”线程错误4: EOLeException 连接失败 我跟踪过,是本地接连打不开(ADOTEST1。OPEN 执行到该句就错) 最后无论你如何再对本地连接ADOCONNECTION1 打开都是没用的, 只有关了程序再打开才能使用。

现将线程代码帖上:
procedure TMYCONNECT.Execute; //×Ô¶¨ÒåÁ¬½ÓỊ̈߳¬Ö÷Òª²âÊÔÁ¬½ÓÊÇ·ñ³É¹¦
begin
try
try
CoInitialize(nil);
except
on E: EXCEPTION do
begin
form1.listbox1.items.insert(0,formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' Ï̴߳íÎó1£º' + E.ClassName + ' ' + E.Message);
CoUninitialize;
EXIT;
end;
end;
form1.Timer3.Enabled := FALSE;
//本地数据库
try
if ADOQueryA.Active then
form1.static1.caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÒѾ­Á¬½Óµ½±¾µØÊý¾Ý¿â·þÎñÆ÷1'
else
begin
if form1.Timer1.Enabled =true then
form1.Timer1.Enabled :=false;
form1.static1.caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÕýÔÚ²âÊÔÁ¬½Óµ½±¾µØÊý¾Ý¿â1... ...';
end;
except
on E: EXCEPTION do
begin
form1.listbox1.items.insert(0,formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' Ï̴߳íÎó1£º' + E.ClassName + ' ' + E.Message);
form1.Timer3.Enabled := TRUE;
EXIT;
end;
end;
Synchronize(application.ProcessMessages);
ADOQueryA.Active := FALSE;
ADOQueryA.Close;
form1.listbox1.items.insert(0,'EXECUTE ADOQUERYA¡£CLOSE');
try
ADOQueryA.Open ; //出错的地方就在这里!!!!!
ADOQueryA.Active := TRUE;
except
on E: Exception do
begin
form1.ADOConnection1.Close;
form1.listbox1.items.insert(0,formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' Ô­Òò£º' + E.Message) ;
form1.static1.Caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÎÞ·¨Á¬½Óµ½±¾µØÊý¾Ý¿â,Çë¼ì²éÍøÂç,10ÃëºóÖØÊÔ1';
ADOQueryA.Active := FALSE;
form1.Timer3.Enabled := TRUE;
CoUninitialize;
SELF.Terminate;
EXIT;
end;
end;

//远程数据库
try
form1.static2.caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÒѾ­Á¬½Óµ½±¾»úÊý¾Ý¿â·þÎñÆ÷2';
if ADOQueryB.Active then
form1.static2.caption:= formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÒѾ­Á¬½ÓÔ¶³ÌÊý¾Ý¿â·þÎñÆ÷1'
else
begin
if form1.Timer1.Enabled =true then
form1.Timer1.Enabled :=false;
form1.static2.caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÕýÔÚ²âÊÔÁ¬½Óµ½Ô¶³ÌÊý¾Ý¿â·þÎñÆ÷.....1';
end;
except
on E: EXCEPTION do
begin
form1.listbox1.items.insert(0,formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' Ï̴߳íÎó3£º' + E.ClassName + ' ' + E.Message);
form1.Timer3.Enabled := TRUE;
EXIT;
end;
end;

ADOQueryB.Close;
try
ADOQueryB.Open;
ADOQueryB.Active := TRUE;
form1.STATIC2.caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÒѾ­Á¬½Óµ½Ô¶³ÌÊý¾Ý¿â·þÎñÆ÷2';
except
on E: Exception do
begin
Synchronize(form1.ADOConnection2.Close);
form1.listbox1.items.insert(0,formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' Ô­Òò£º' + E.Message);
form1.STATIC2.caption := formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' ÎÞ·¨Á¬½Óµ½Ô¶³ÌÊý¾Ý¿â·þÎñÆ÷,Çë¼ì²éÍøÂç,10ÃëºóÖØÊÔ1';
Synchronize(application.ProcessMessages);
end;
end;
form1.Timer3.Enabled := TRUE;
if form1.Timer1.Enabled =false then
form1.Timer1.Enabled :=true;
CoUninitialize;
SELF.Terminate;
except
on E: EXCEPTION do
begin
form1.Timer3.Enabled := TRUE;
form1.listbox1.items.insert(0,formatdatetime('YYYY-MM-DD HH:MM:SS',now) + ' Ï̴߳íÎó4£º' + E.ClassName + ' ' + E.Message);
ABORT;
end;
end;
end;


再将执行的步骤部分代码
//执行第一步
if (zt=true)and(bz=1) then
begin
timer1.Enabled :=false;
bz_zt:=0; //²½Öè״̬±äÁ¿£¬ ÓÃÓÚÅжÏÊÇ·ñ½øÐÐÁËÊý¾Ý²åÈë¼°µ±Ç°×´Ì¬±íÒѾ­ÐÞ¸Ä
statusbar1.Panels.Items[2].Text:='¹¤³ÌÊôÐÔ±í¼Ç¼¸üÐÂ... ... ';
listbox1.items.insert(0,datetimetostr(now)+' : Ö´ÐеÚÒ»²½ ¹¤³ÌÊôÐÔ±í¼Ç¼¸üР... ... ');
with adoquery2 do
begin
SQL.Clear ;
SQL.ADD('DELETE FROM '+SQLDATA+'.DBO.¹¤³ÌÊôÐÔ±í');
if connection.InTransaction then
connection.CommitTrans ;
connection.BeginTrans ;
try
ExecSQL ;
connection.CommitTrans ;
bz_zt:=bz_zt+1;
except
connection.RollbackTrans ;
end;
if bz_zt=0 then //ɾ³ý¹¤³ÌÊôÐÔ±í²»³É¹¦
begin
listbox1.items.insert(0,datetimetostr(now)+': Ö´ÐеÚÒ»²½ ¹¤³ÌÊôÐÔ±í¼Ç¼¸üР³ö´í! ');
timer1.Enabled :=true;
exit;
end;
SQL.Clear ;
SQL.Add('insert into '+SQLDATA+'.DBO.¹¤³ÌÊôÐÔ±í');
sql.add('(±êʶºÅ,Ö¤ºÅ,°¸¼þ±àºÅ,ÏîÄ¿Ãû³Æ,½¨ÉèµØÖ·,½¨É赥λ,½¨ÉèÐÔÖÊ,½¨Öþ½á¹¹,');
sql.Add('Ͷ×ʹæÄ£,ÓõØÐÔÖÊ´úÂë,»ùµ×Ãæ»ý,×ܽ¨ÖþÃæ»ý,½¨Öþ×ܸ߶È,µØÉϲãÊý,µØÉÏÃæ»ý,');
sql.Add('µØϲãÊý,µØÏÂÃæ»ý,Éè¼Æµ¥Î»,Ê©¹¤µ¥Î»,·¢Ö¤Ê±¼ä,¶àýÌå,±¸×¢) values(');
sql.Add(':bsh,:zh,:ajbh,:xmmc,:jsdz,:jsdw,:jsxz,:jzjg,:tzgm,:ydxzdm,:jdmj,:zjzmj,');
sql.Add(':jzzgd,:dscs,:dsmj,:dxcs,:dxmj,:sjdw,:sgdw,:fzsj,:dmt,:bz)');
end;
adoquery1.SQL.Clear ;
adoquery1.SQL.Add('select * from ¹¤³ÌÊôÐÔ±í ');
adoquery1.Open ;

if adoquery2.connection.InTransaction then
adoquery2.connection.CommitTrans ;
adoquery2.connection.BeginTrans ;
try
while not adoquery1.Eof do
begin
adoquery2.Parameters.ParamByName('bsh').Value :=adoquery1.fieldbyname('±êʶºÅ').AsInteger;
adoquery2.Parameters.ParamByName('zh').Value :=adoquery1.fieldbyname('Ö¤ºÅ').AsString ;
adoquery2.Parameters.ParamByName('ajbh').Value :=adoquery1.fieldbyname('°¸¼þ±àºÅ').AsString ;
adoquery2.Parameters.ParamByName('xmmc').Value :=adoquery1.fieldbyname('ÏîÄ¿Ãû³Æ').AsString ;
adoquery2.Parameters.ParamByName('jsdz').Value :=adoquery1.fieldbyname('½¨ÉèµØÖ·').AsString ;
adoquery2.Parameters.ParamByName('jsdw').Value :=adoquery1.fieldbyname('½¨É赥λ').AsString ;
adoquery2.Parameters.ParamByName('jzjg').Value :=adoquery1.fieldbyname('½¨Öþ½á¹¹').AsString ;
adoquery2.Parameters.ParamByName('tzgm').Value :=adoquery1.fieldbyname('Ͷ×ʹæÄ£').AsFloat ;
adoquery2.Parameters.ParamByName('ydxzdm').Value :=adoquery1.fieldbyname('ÓõØÐÔÖÊ´úÂë').AsString ;
adoquery2.Parameters.ParamByName('jdmj').Value :=adoquery1.fieldbyname('»ùµ×Ãæ»ý').AsFloat ;
adoquery2.Parameters.ParamByName('zjzmj').Value :=adoquery1.fieldbyname('×ܽ¨ÖþÃæ»ý').AsFloat ;
adoquery2.Parameters.ParamByName('jzzgd').Value :=adoquery1.fieldbyname('½¨Öþ×ܸ߶È').AsFloat ;
adoquery2.Parameters.ParamByName('dscs').Value :=adoquery1.fieldbyname('µØÉϲãÊý').AsString ;
adoquery2.Parameters.ParamByName('dsmj').Value :=adoquery1.fieldbyname('µØÉÏÃæ»ý').Asfloat ;
adoquery2.Parameters.ParamByName('dxcs').Value :=adoquery1.fieldbyname('µØϲãÊý').AsString ;
adoquery2.Parameters.ParamByName('dxmj').Value :=adoquery1.fieldbyname('µØÏÂÃæ»ý').Asfloat ;
adoquery2.Parameters.ParamByName('sjdw').Value :=adoquery1.fieldbyname('Éè¼Æµ¥Î»').AsString ;
adoquery2.Parameters.ParamByName('sgdw').Value :=adoquery1.fieldbyname('Ê©¹¤µ¥Î»').AsString ;
// adoquery2.Parameters.ParamByName('fzsj').Value :=adoquery1.fieldbyname('·¢Ö¤Ê±¼ä').AsDateTime ;
IF ADOQUERY1.FieldByName('·¢Ö¤Ê±¼ä').AsVariant<>NULL THEN
adoquery2.Parameters.ParamByName('fzsj').Value :=adoquery1.fieldbyname('·¢Ö¤Ê±¼ä').AsDateTime
ELSE
adoquery2.Parameters.ParamByName('fzsj').Value:=NULL;
adoquery2.Parameters.ParamByName('dmt').Value :=adoquery1.fieldbyname('¶àýÌå').AsString ;
adoquery2.Parameters.ParamByName('bz').Value :=adoquery1.fieldbyname('±¸×¢').AsString ;
adoquery2.ExecSQL ;

adoquery1.Next ;
end;
adoquery2.connection.CommitTrans ;
bz_zt:=bz_zt+1;
except
adoquery2.connection.RollbackTrans ;
end;

//Ð޸ĵ±Ç°×´Ì¬±í
if bz_zt=2 then
BEGIN
if rzquery.connection.InTransaction then
rzquery.connection.CommitTrans ;
rzquery.connection.BeginTrans ;
rzquery.SQL.Clear ;
rzquery.SQL.Add('update '+SQLDATALOG+'.DBO.µ±Ç°×´Ì¬±í set Íê³Éʱ¼ä=:sj,µ±Ç°×´Ì¬=:zt where ²½Öè=:bz ');
rzquery.Parameters.ParamByName('sj').Value :=Now;
rzquery.Parameters.ParamByName('zt').Value :='ÒÑ´¦Àí';
rzquery.Parameters.ParamByName('bz').Value :=bz;
rzquery.ExecSQL ;
try
rzquery.connection.CommitTrans ;
bz_zt:=bz_zt+1;
except
rzquery.connection.RollbackTrans ;
end;
END;
if bz_zt=3 then //µ± Íê³ÉÊý¾Ý²åÈë¼°µ±Ç°×´Ì¬±íÐÞ¸Äºó ²½ÖèÒƵ½ÏÂÒ»²½
begin
listbox1.items.insert(0,datetimetostr(now)+': Ö´ÐеÚÒ»²½ ¹¤³ÌÊôÐÔ±í¼Ç¼¸üР¹¤×÷Íê³É! ');
bz:=bz+1;
end
else
listbox1.items.insert(0,datetimetostr(now)+': Ö´ÐеÚÒ»²½ ¹¤³ÌÊôÐÔ±í¼Ç¼¸üР³ö´í! ');
timer1.Enabled :=true;
statusbar1.Panels.Items[2].Text:='';
exit;
end;
//执行第二步
if (zt=true)and(bz=2) then
begin
timer1.Enabled :=false;
bz_zt:=0; //²½Öè״̬±äÁ¿£¬ ÓÃÓÚÅжÏÊÇ·ñ½øÐÐÁËÊý¾Ý²åÈë¼°µ±Ç°×´Ì¬±íÒѾ­ÐÞ¸Ä
listbox1.items.insert(0,datetimetostr(now)+' : Ö´Ðеڶþ²½ ÓõØÊôÐÔ±í¼Ç¼¸üР... ... ');
statusbar1.Panels.Items[2].Text:='ÓõØÊôÐÔ±í¼Ç¼¸üÐÂ... ... ';
with adoquery2 do
begin
SQL.Clear ;
SQL.ADD('DELETE FROM '+SQLDATA+'.DBO.ÓõØÊôÐÔ±í');
if connection.InTransaction then
connection.CommitTrans ;
connection.BeginTrans ;
try
ExecSQL ;
connection.CommitTrans ;
bz_zt:=bz_zt+1;
except
connection.RollbackTrans ;
end;
if bz_zt=0 then //ɾ³ý¹¤³ÌÊôÐÔ±í²»³É¹¦
begin
listbox1.items.insert(0,datetimetostr(now)+' : Ö´Ðеڶþ²½ ÓõØÊôÐÔ±í¼Ç¼¸üР³ö´í! ');
timer1.Enabled :=true;
exit;
end;
SQL.Clear ;
SQL.Add('insert into '+SQLDATA+'.DBO.ÓõØÊôÐÔ±í');
sql.add('(±êʶºÅ,Ö¤ºÅ,°¸¼þ±àºÅ,ÏîÄ¿Ãû³Æ,½¨ÉèµØÖ·,µ¥Î»Ãû³Æ,ÓõØÐÔÖÊ,ÓõØÐÔÖÊ´úÂë,');
sql.Add('×ÜÓõØÃæ»ý,Ͷ×ʹæÄ£,Ͷ×ÊÐÔÖÊ,·¢Ö¤Ê±¼ä,±ä¸üÀúÊ·,¶àýÌå,±¸×¢,ÊÇ·ñÓÐЧ)');
sql.add(' values(:bsh,:zh,:ajbh,:xmmc,:jsdz,:dwmc,:ydxz,:ydxzdm,:zydmj,:tzgm,');
sql.add(':tzxz,:fzsj,:bgls,:dmt,:bz,:sfyx)');
end;
adoquery1.SQL.Clear ;
adoquery1.SQL.Add('select * from ÓõØÊôÐÔ±í ');
adoquery1.Open ;
if adoquery2.connection.InTransaction then
adoquery2.connection.CommitTrans ;
adoquery2.connection.BeginTrans ;
try
while not adoquery1.Eof do
begin
adoquery2.Parameters.ParamByName('bsh').Value :=adoquery1.fieldbyname('±êʶºÅ').AsInteger;
adoquery2.Parameters.ParamByName('zh').Value :=adoquery1.fieldbyname('Ö¤ºÅ').AsString ;
adoquery2.Parameters.ParamByName('ajbh').Value :=adoquery1.fieldbyname('°¸¼þ±àºÅ').AsString ;
adoquery2.Parameters.ParamByName('xmmc').Value :=adoquery1.fieldbyname('ÏîÄ¿Ãû³Æ').AsString ;
adoquery2.Parameters.ParamByName('jsdz').Value :=adoquery1.fieldbyname('½¨ÉèµØÖ·').AsString ;
adoquery2.Parameters.ParamByName('dwmc').Value :=adoquery1.fieldbyname('µ¥Î»Ãû³Æ').AsString ;
adoquery2.Parameters.ParamByName('ydxz').Value :=adoquery1.fieldbyname('ÓõØÐÔÖÊ').Asstring;
adoquery2.Parameters.ParamByName('ydxzdm').Value :=adoquery1.fieldbyname('ÓõØÐÔÖÊ´úÂë').Asstring ;
adoquery2.Parameters.ParamByName('zydmj').Value :=adoquery1.fieldbyname('×ÜÓõØÃæ»ý').AsFloat ;
adoquery2.Parameters.ParamByName('tzgm').Value :=adoquery1.fieldbyname('Ͷ×ʹæÄ£').Asfloat ;
adoquery2.Parameters.ParamByName('tzxz').Value :=adoquery1.fieldbyname('Ͷ×ÊÐÔÖÊ').Asstring;
IF ADOQUERY1.FieldByName('·¢Ö¤Ê±¼ä').AsVariant<>NULL THEN
adoquery2.Parameters.ParamByName('fzsj').Value :=adoquery1.fieldbyname('·¢Ö¤Ê±¼ä').AsDateTime
ELSE
adoquery2.Parameters.ParamByName('fzsj').Value:=NULL;

adoquery2.Parameters.ParamByName('bgls').Value :=adoquery1.fieldbyname('±ä¸üÀúÊ·').AsString ;
adoquery2.Parameters.ParamByName('dmt').Value :=adoquery1.fieldbyname('¶àýÌå').AsString ;
adoquery2.Parameters.ParamByName('bz').Value :=adoquery1.fieldbyname('±¸×¢').AsString ;
adoquery2.Parameters.ParamByName('sfyx').Value :=adoquery1.fieldbyname('ÊÇ·ñÓÐЧ').AsString ;
adoquery2.ExecSQL ;

adoquery1.Next ;
end;
adoquery2.connection.CommitTrans ;
bz_zt:=bz_zt+1;
except
adoquery2.connection.RollbackTrans ;
end;
//Ð޸ĵ±Ç°×´Ì¬±í
if bz_zt=2 then
BEGIN
if rzquery.connection.InTransaction then
rzquery.connection.CommitTrans ;
rzquery.connection.BeginTrans ;
rzquery.SQL.Clear ;
rzquery.SQL.Add('update '+SQLDATALOG+'.DBO.µ±Ç°×´Ì¬±í set Íê³Éʱ¼ä=:sj,µ±Ç°×´Ì¬=:zt where ²½Öè=:bz ');
rzquery.Parameters.ParamByName('sj').Value :=Now;
rzquery.Parameters.ParamByName('zt').Value :='ÒÑ´¦Àí';
rzquery.Parameters.ParamByName('bz').Value :=bz;
rzquery.ExecSQL ;
try
rzquery.connection.CommitTrans ;
bz_zt:=bz_zt+1;
except
rzquery.connection.RollbackTrans ;
end;
END;
if bz_zt=3 then //µ± Íê³ÉÊý¾Ý²åÈë¼°µ±Ç°×´Ì¬±íÐÞ¸Äºó ²½ÖèÒƵ½ÏÂÒ»²½
begin
bz:=bz+1;
listbox1.items.insert(0,datetimetostr(now)+' : Ö´Ðеڶþ²½ ÓõØÊôÐÔ±í¼Ç¼¸üР¹¤×÷Íê³É! ');
end
else
listbox1.items.insert(0,datetimetostr(now)+' : Ö´Ðеڶþ²½ ÓõØÊôÐÔ±í¼Ç¼¸üР³ö´í! ');

timer1.Enabled :=true;
exit;
end;
//µÚÈý²½ ¹æ»®ÊôÐÔ±í±íËùÓмǼ¸üÐÂ


看谁能帮帮我???
 
头晕,太长了,看不下去
 
头晕,太长了,看不下去

-----------------------------------
老兄不要晕, 你可以先说说这个错误线程错误4: EOLeException 大括是什么问题?如何解决?
 
后退
顶部