Connection failure

goodhj 2010-07-29 04:40:06
使用Adoconnection连接SqlServer数据库,数据库重启,网络异常(比如拔了网线又插上),运行着的程序如果执行数据库操作则会出现 Connection failure错误,我不想关了程序再重新运行,也不想在每执行一个数据库操作都用Try ... Except ...End 在Except部分执行Adoconnection.Close;Adoconnection.Open;这两句来解决,因为这是事后补救,而且这种办法可以在Adoconnection的OnExecuteComplete事件中做控制,还不用在每个数据库操作去补加,比如
if SameText(Error.Description,'Connection Failure') then
begin
ADOConnection1.Close;
ADOConnection1.Open;
end;
我想要事前解决掉,意思就是我程序运行着,如果发生(数据库重启,拔了网线又插上)类似情况,程序能一次都不报Connection failure错误,象没发生过一样。Adoconnetion的OnInfoMessage是捕捉不到这个错误的。各位大仙帮帮忙啊
...全文
527 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodhj 2010-08-02
  • 打赏
  • 举报
回复
楼上的办法对我的情况没有多大帮助,我的情况是随时要从数据库上获取信息,并不是单纯的数据保存问题。

我用我的办法加2楼提供的思路解决了这个问题,不算完美,因为还是是事后控制的,但效果还可以,应该效率比每次执行数据库操作前查询下那样的办法要高点。谢谢各位!
goodhj 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sqldebug_fan 的回复:]
ADO没有判断链接是否正常的接口,一般采用的是从执行一条SQL语句,看是否正常返回,我们用的SQL语句是:
SELECT 1 AS FieldName FROM TableName WHERE 1=2
[/Quote]

这个办法是否影响效率啊?每个数据库操作前执行下那个语句,就相当于多了好几十毫秒,相当于多了个数据库操作,介绍下你们的具体做法,谢谢!
goodhj 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kye_jufei 的回复:]
定義一個常量或變量來控制網絡是否正常;當正常時,顯示OK,不正常時給出提出即可...
[/Quote]

数据库重启了呢?
kye_jufei 2010-07-30
  • 打赏
  • 举报
回复
定義一個常量或變量來控制網絡是否正常;當正常時,顯示OK,不正常時給出提出即可...
iqyely 2010-07-30
  • 打赏
  • 举报
回复
来关注下。
SQLDebug_Fan 2010-07-30
  • 打赏
  • 举报
回复
ADO没有判断链接是否正常的接口,一般采用的是从执行一条SQL语句,看是否正常返回,我们用的SQL语句是:
SELECT 1 AS FieldName FROM TableName WHERE 1=2
goodhj 2010-07-30
  • 打赏
  • 举报
回复
如何判断数据库链接是否正常?AdoConnection只要成功连接后,它自动一直保持Connected为true,除非执行Close操作,数据库重启,网络异常(比如拔了网线又插上)情况发生时Connected也不会有变化,但实际上上述情况发生后,AdoConnection的连接已经是虚连接了,所以才有Connection failure错误。就是不知道如何判断数据库链接是否正常?难道专门写个查询来验证连接是否有效?这是笨办法,有没有更好的主意?
SQLDebug_Fan 2010-07-30
  • 打赏
  • 举报
回复
两层中数据库断了一般只有重连,可以这样处理,每次操作前都判断数据库链接是否正常,如果不正常,则弹出一个对话框提示正在重连数据库。
goodhj 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tjianliang 的回复:]
1、两层且采取长连接方式是有这种问题的,如果是三层就没有
2、除了每处用异常处理外,可以尝试在Application.OnException,即全局异常中统一处理
[/Quote]

跟长连接不长连接没有关系吧?因为Ado一旦连过一次后它就自己保持连接状态,除非每次执行完数据库操作就将连接Close,这样效率损失太大吧?
三层中也是有这种问题的吧?我就是在三层中碰到这种问题了,请问三层中如何设置能避免这种问题?
kye_jufei 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 goodhj 的回复:]
引用 8 楼 kye_jufei 的回复:
定義一個常量或變量來控制網絡是否正常;當正常時,顯示OK,不正常時給出提出即可...


数据库重启了呢?
[/Quote]
重啟時也有傳值啊,我現在的程序裡就是這樣做的:
當沒有網絡時,數據暫存在本地;待網絡暢通時直接傳到SQL上;當你重啟後,給你一個caption提示或顯示出來提示的信息即可;這樣數據才會即時和實時,根本不會出現你所說的這樣問題。。。這是程序技術方法問題,根本不會影響程序或數據庫的效率...
kye_jufei 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 goodhj 的回复:]
引用 8 楼 kye_jufei 的回复:
定義一個常量或變量來控制網絡是否正常;當正常時,顯示OK,不正常時給出提出即可...


数据库重启了呢?
[/Quote]
重啟時也有傳值啊,我現在的程序裡就是這樣做的:
當沒有網絡時,數據暫存在本地;待網絡暢通時直接傳到SQL上;當你重啟後,給你一個caption提示或顯示出來提示的信息即可;這樣數據才會即時和實時,根本不會出現你所說的這樣問題。。。這是程序技術方法問題,根本不會影響程序或數據庫的效率...
亮剑_ 2010-07-29
  • 打赏
  • 举报
回复
1、两层且采取长连接方式是有这种问题的,如果是三层就没有
2、除了每处用异常处理外,可以尝试在Application.OnException,即全局异常中统一处理
ntjrr 2010-07-29
  • 打赏
  • 举报
回复
关注一下,象没发生过一样估计较难,即使你写代码悄无声息地重连数据库,但前提是要能很快连起来,就象你说的,如果网线松了(象拨掉一样)在网线上没处理的时候,你软件上又没提示错误,那不就象死机一样没反应了?

2,507

社区成员

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

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