一个经典问题,好像提过多次,没有完美答案! 我用delphi的ado方式连接局域网内另一台服务器上的sqlserver,如果网络发生很短暂的中断出现也会出现“连接失败”提示,必须重新启动程序,才能正常连接。想请教高手,有什么办法解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、加一个timer控件,时时检查SQL是否正常连接,如果非人为断开立即连接;2、捕捉该异常,然后连接SQL服务器 我是用的几个adoquery共用一个ADOConnection //数据模块单元代码:procedure TDataModule1.DataModuleCreate(Sender:TObject);begin with mainform.ConDB do //condb为主窗体mainform里面的一个panel控件 begin Visible:=true;//显示连接数据库提示信息 left:=(mainform.width-6)div 2-width div 2; end; mainform.Refresh; OpenLink;end;procedure TDataModule1.OpenLink;var ini:Tinifile; s,DSource:string;begin Timer.Enabled:=false;//timer时钟控件 mainform.ConDB.Caption:='正在连接数据库,请稍等……'; mainform.ConDB.Show; //显示提示信息 //读取ini文件里面的数据源信息,具体情况可以自己修改 ini:=Tinifile.Create(extractfilepath(paramstr(0))+'DataConnect.ini'); try DSource:=ini.ReadString('DataBase','Server','qzdb'); finally ini.Free; end; s:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=qzled;Data Source=.'; s:=s+';Data Source='+DSource; try ADOConnection1.Close; ADOConnection1.ConnectionString:=s; ADOConnection1.Open; mainform.ConDB.Visible:=false;//隐藏连接数据图提示 //数据库连接成功后,这里可以进行你要想做的操作 {......} except Tag:=Tag+1; mainform.ConDB.Caption:='[ '+inttostr(Tag)+'次 ]连接数据库失败!10秒后重试'; Timer.Interval:=10000; Timer.Enabled:=true; end; end;......//MainForm中,如果数据库连接失败,调用ReConDB函数重新连接数据库//注意使用异常处理中来判断数据库连接是否正常//try//{...数据库操作(查询、读、写、删...)...}//except// ReConDB;//end;procedure TMainform.ReConDB;begin DataModule1.ADOConnection1.Connected:=false; DataModule1.Timer.Tag:=0; DataModule1.Timer.Interval:=3000; DataModule1.Timer.Enabled:=true;end;有什么问题可以给我留言...... 在ADOConnection1BeforeDisconnect或ADOConnection1AfterDisconnect事件中重连 用TIMER不是很好吧,不如加个线程,判断是否在用,在用则刷新,没在用则重连 不用重新启动程序的吧?关闭adoconnection再重新open,就可以的了 也可以采取如下方式procedure TdtmData.AppErrorException(Sender: TObject; E: Exception);var temp:string;begin if (PosEx('DBNETLIB',E.Message)>0) OR (PosEx(Prompt_Net,E.Message)>0) then begin //断线重连 end else MessageDLG(E.Message,mtWarning,[mbok],0);}end; ADOConnection.OnInfoMessage事件中处理一下。 1、对于目前两层的应用来说,ADOConnection连接的异常是没有办法捉到的,只能像上面所说的那样,加一个timer控件,定时去调用一个线程,检查SQL是否正常连接,可以每隔20秒查一次。。用一个adoquery,语句可以参考如下: try sp_main_frm.ADOQuery1.Close; sp_main_frm.ADOQuery1.SQL.Clear; sp_main_frm.ADOQuery1.SQL.Add('select 1'); sp_main_frm.ADOQuery1.Open; except try sp_main_frm.Timer2.Enabled:=false; sp_main_frm.ADOConnection2.Connected:=false; sp_main_frm.ADOConnection2.Connected:=true; except end; end; 好久沒提問了:有關BPL的問題,有經驗的朋友請進? 如何调用 chm 文件 ????????? 送分:请问如何添加资源文件? 一个十分简单的问题。关于Function的用法!! fastreport中如何分组?(每5条分组) 请问:这类问题学vc好还是学dephi好? 动态创建控件的问题十万火急 Delphi中关于DLL调用dll的问题? 新手一问 笑熬江湖 rave 5.0 打印问题 有哪位大侠用过TAPI控件啊,能分享一下怎么使用TAPI啊???
2、捕捉该异常,然后连接SQL服务器
//数据模块单元代码:
procedure TDataModule1.DataModuleCreate(Sender:TObject);
begin
with mainform.ConDB do //condb为主窗体mainform里面的一个panel控件
begin
Visible:=true;//显示连接数据库提示信息
left:=(mainform.width-6)div 2-width div 2;
end;
mainform.Refresh;
OpenLink;
end;procedure TDataModule1.OpenLink;
var
ini:Tinifile;
s,DSource:string;
begin
Timer.Enabled:=false;//timer时钟控件
mainform.ConDB.Caption:='正在连接数据库,请稍等……';
mainform.ConDB.Show; //显示提示信息
//读取ini文件里面的数据源信息,具体情况可以自己修改
ini:=Tinifile.Create(extractfilepath(paramstr(0))+'DataConnect.ini');
try
DSource:=ini.ReadString('DataBase','Server','qzdb');
finally
ini.Free;
end;
s:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=qzled;Data Source=.';
s:=s+';Data Source='+DSource; try
ADOConnection1.Close;
ADOConnection1.ConnectionString:=s;
ADOConnection1.Open; mainform.ConDB.Visible:=false;//隐藏连接数据图提示
//数据库连接成功后,这里可以进行你要想做的操作
{......}
except
Tag:=Tag+1;
mainform.ConDB.Caption:='[ '+inttostr(Tag)+'次 ]连接数据库失败!10秒后重试';
Timer.Interval:=10000;
Timer.Enabled:=true;
end;
end;
......
//MainForm中,如果数据库连接失败,调用ReConDB函数重新连接数据库
//注意使用异常处理中来判断数据库连接是否正常
//try
//{...数据库操作(查询、读、写、删...)...}
//except
// ReConDB;
//end;
procedure TMainform.ReConDB;
begin
DataModule1.ADOConnection1.Connected:=false;
DataModule1.Timer.Tag:=0;
DataModule1.Timer.Interval:=3000;
DataModule1.Timer.Enabled:=true;
end;
有什么问题可以给我留言......
不用重新启动程序的吧?关闭adoconnection再重新open,就可以的了
var temp:string;
begin
if (PosEx('DBNETLIB',E.Message)>0) OR (PosEx(Prompt_Net,E.Message)>0) then
begin
//断线重连
end
else
MessageDLG(E.Message,mtWarning,[mbok],0);}
end;
try
sp_main_frm.ADOQuery1.Close;
sp_main_frm.ADOQuery1.SQL.Clear;
sp_main_frm.ADOQuery1.SQL.Add('select 1');
sp_main_frm.ADOQuery1.Open;
except
try
sp_main_frm.Timer2.Enabled:=false; sp_main_frm.ADOConnection2.Connected:=false;
sp_main_frm.ADOConnection2.Connected:=true;
except
end;
end;