如何解决IBX连的数据库中途掉线问题?

coaco 2004-09-21 06:30:54
不是说会自动掉线,而是指中途由于网络或是服务器故障掉线
最理想的情况是包在try块内,但是由于TIBDatabase是自动连接的(只要你打开一个相关联数据集它就会自动连接,COMMIT的时候自动关闭,TIBDatabase没有给出连接失放的事件,而是自己来处理这样的事件的,然后给出一个什么什么“远程服务器强行中止了一个连接”,或者“因为目标机器积极地拒绝它”之类的提示,很傻,而且无法安装一个后续的处理过程代码,办法是可以想出来的,可是想来想去,没有什么比较理想的方法,最好版主也来回答一下这个问题 :)偶来学习一下,呵呵
...全文
162 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
coaco 2004-10-23
  • 打赏
  • 举报
回复
算了。
eccalc 2004-10-02
  • 打赏
  • 举报
回复
这时候前台的状态:TIBDATABASE:Connected
某个窗体打开,有数据敏感控件连接着 TIBDataSet也打开。
--------------------------
这个时候,客户端开始建立了事务,也就是说在内存中它保存了事务,其中包括一致性,域检测等

此时我后台关闭了FB服务,请注意,这是人为的行动,为了调试或者其它的原因。
--------------------------
这个时候虽然服务器Down,但是客户端的事务还是存在(内存中)。

前台没有保存数据时并不知道后台的情况,这时候用户按下了“保存”。。。
-----------------------------------
客户端开始尝试提交数据库变化(把内存中的事务记录),但是无法提交,于是异常抛出

-------------------------------------
如果服务器不是采用NT回调机制,它就不是是同步性交互的,所以要它在任何情况下,包括断开与服务器交互时,在客户端记录事务时它就不管啦,因此就可以无条件退出。
coaco 2004-09-29
  • 打赏
  • 举报
回复
我说的不清楚:
情况是这样的,前面一切都正常
这时候前台的状态:TIBDATABASE:Connected
某个窗体打开,有数据敏感控件连接着 TIBDataSet也打开。
此时我后台关闭了FB服务,请注意,这是人为的行动,为了调试或者其它的原因。
前台没有保存数据时并不知道后台的情况,这时候用户按下了“保存”。。。
于是出现出错信息,
然后程序就反复的出现出错信息,我现在要捕捉它关闭应用程序。
由于是直接和数据库连接的,无所谓数据丢失,我只要关了应用程序就可以了
但是捕捉不到的后果就是,关闭不了,除了DEL+CTRL+ALT之外,都不可以关闭。
就算捕捉到了,也不能设置TIBDataSet->Close();这样做的结果仍然是弹出出错信息,但是你要不关了它,直接用Terminate()关就会出错另外的出错信息
跟服务器没什么关系,这时候服务器SHUTDOWN了。
eccalc 2004-09-27
  • 打赏
  • 举报
回复
一个非常典型的是:只要你在IB中定义了触发器,不管你有没有提交,只要触发了,客户端是必须和服务器交互的。如果完全切断与服务器的交互,只能用下线模式啦。
这个不是IBX本身引起的,关键是你的服务器的设置问题,
你可以打开IB服务器的:把"Run the interbase server as as a service on windows NT"
的勾去掉试试。
今天哥们很忙,没有时间详细说明啦!(有点像回调机制)
coaco 2004-09-27
  • 打赏
  • 举报
回复
我把CommitRetaining()和Commit()都封装了,达不到要求,因为除了事务提交之外,也会有和远程序数据库的交互,只是没有提交罢了,只要有交互,必有出错信息。
另外,我喜欢查询之后用Commit(),也就是切断了和数据库的连接,下次查询重新连接,这样判断Connected也是没有意义的。
问题主要是,如果有POST就会出现一个出错信息(指手工关闭了后台数据库)
一是想把这个出错信息自定义,只要简单关闭应用程序,就行,但是IBX控件这个时候强行关闭又会冒出一个出错信息,读XXX内存写XXX内存之类,陷入一个怪圈,连接关不掉(一关就出错),杀死它也要和你罗嗦一番,真麻烦。
eccalc 2004-09-24
  • 打赏
  • 举报
回复
if( IBTransaction1->InTransaction)
{
try
{
//提交数据库,然后重新启动事务.
IBTransaction1->CommitRetaining();
}
catch (Exception &E)//如果错误,重新启动事务
{
IBTransaction1->RollbackRetaining();
ShowMessage("提交数据出错,系统恢复到原来姿态!. "+E.Message);
}
}
BorlandXBuilder 2004-09-22
  • 打赏
  • 举报
回复
我感觉很少人用IB,我也在用IB,也碰到很多问题,解决不了
coaco 2004-09-22
  • 打赏
  • 举报
回复
没人感兴趣?

1,178

社区成员

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

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