一个经典问题,好像提过多次,没有完美答案!

plutu 2009-12-28 04:02:12
我用delphi的ado方式连接局域网内另一台服务器上的sqlserver,如果网络发生很短暂的中断出现也会出现“连接失败”提示,必须重新启动程序,才能正常连接。想请教高手,有什么办法解决?
...全文
402 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qkhhxkj102 2009-12-29
  • 打赏
  • 举报
回复
我一般用定时器不停的判断连接
jiujiang88 2009-12-29
  • 打赏
  • 举报
回复
不错,学习下了
plutu 2009-12-29
  • 打赏
  • 举报
回复
谢谢各位!我先试一下再留言!
xjq2003 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yct0605 的回复:]
Delphi(Pascal) code//数据模块单元代码:procedure TDataModule1.DataModuleCreate(Sender:TObject);beginwith mainform.ConDBdo//condb为主窗体mainform里面的一个panel控件begin
Visible:=true;//显示连接数据库提示信息
left:=(mainform.width-6)div2-widthdiv2;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;

......

Delphi(Pascal) code//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;

有什么问题可以给我留言......
[/Quote]学习
styx0512 2009-12-29
  • 打赏
  • 举报
回复
占个位置...
学习...
CACACACACA 2009-12-29
  • 打赏
  • 举报
回复
ADOConnection.OnInfoMessage事件中处理一下。
yfsoft518 2009-12-29
  • 打赏
  • 举报
回复
也可以采取如下方式

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;
qq47772369 2009-12-29
  • 打赏
  • 举报
回复
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;
ok1411 2009-12-29
  • 打赏
  • 举报
回复
不对,是定时器判断,让线程去重连
ok1411 2009-12-29
  • 打赏
  • 举报
回复
线程中放个定时器来判断
J198728 2009-12-28
  • 打赏
  • 举报
回复
mark
haitao 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 plutu 的回复:]
我用delphi的ado方式连接局域网内另一台服务器上的sqlserver,如果网络发生很短暂的中断出现也会出现“连接失败”提示,必须重新启动程序,才能正常连接。想请教高手,有什么办法解决?
[/Quote]

不用重新启动程序的吧?关闭adoconnection再重新open,就可以的了
wxsan 2009-12-28
  • 打赏
  • 举报
回复
三层更能完美地解决这个问题。
dinoalex 2009-12-28
  • 打赏
  • 举报
回复
用TIMER不是很好吧,不如加个线程,判断是否在用,在用则刷新,没在用则重连
addfox 2009-12-28
  • 打赏
  • 举报
回复
这个问题在实际问题会常用到,学占个位子,以后在来学习!
willflyz 2009-12-28
  • 打赏
  • 举报
回复
可不可以换个问题,用三层的
bdmh 2009-12-28
  • 打赏
  • 举报
回复
在ADOConnection1BeforeDisconnect或ADOConnection1AfterDisconnect事件中重连
yct0605 2009-12-28
  • 打赏
  • 举报
回复

//数据模块单元代码:
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;


有什么问题可以给我留言......
wzwcn 2009-12-28
  • 打赏
  • 举报
回复
每次操作数据库之前判断是否正在连接,不连接就连接就行了
plutu 2009-12-28
  • 打赏
  • 举报
回复
我是用的几个adoquery共用一个ADOConnection
加载更多回复(4)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧