Foxtable(狐表)用户栏目专家坐堂 → 解决远程数据库网络错误的最佳办法


  共有67068人关注过本帖树形打印复制链接

主题:解决远程数据库网络错误的最佳办法

帅哥哟,离线,有人找我吗?
程兴刚
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
解决远程数据库网络错误的最佳办法  发帖心情 Post By:2014/12/17 17:34:00 [显示全部帖子]

很多狐友都在提远程数据库模式下,因网络不稳定,导致系统报错和假死现象,经过我自己的琢磨和总结给出一个简单的解决办法,仅供借鉴:

通常报错截图如下:


图片点击可在新窗口打开查看此主题相关图片如下:20141281381525252.bmp
图片点击可在新窗口打开查看

 

首先可以肯定,出现这个错误不在项目客户端本身,而是在对数据存取”过程中发生的,这就让我们对解决这个问题的办法有了靶向思维,看看下面:

 

第一步:增加一个逻辑型全局变量暂且命名为:网络状态

第二步:  NetworkAddressChanged事件代码

Vars("网络状态") = TryConnectHost(www.jinyt.com) '数据库服务器地址

 

第三步:项目属性BeforeSaveProject事件代码: 

If Vars("网络状态") = False

    e.Cancel = True

    MessageBox.show("对不起,当前网络或服务器不可用,请稍后再保存数据!")

End If

第四步: 假设在您的项目的计划管理定里面设计了定时备份的代码,这里的代码写为这样: 

If Vars("网络状态") = True

    Syscmd.Project.Backup("f:\****系统备份",True) '自动备份路径

End If


以下内容只有回复后才可以浏览

 

说明:大家可能要说,这个方法很复杂,为什么要全局变量?我们首先要了解NetworkAddressChanged事件的功能,他是在网络IP地址发生变化后执行,当远程数据库服务期无法连接,就不能获取到有效的IP地址,原来有效的IP地址在此时发生了变化,可以用该事件监控网络,因此,在这里随时用逻辑型全局变量来保存网络状态,大家就大可不必在什么计划中、或者定时器中频繁地去判断网络是否可用(省去了因不同网速导致的很多时间),而只是在IP地址在此时发生时自动保存了当前状态,然后我们在众多的地方去判断全局变量的值(调用全局变量的值时间快速多了,且不受网络影响),就知道网络状况,让计算机有大部分的时间空闲下来,这就是在这里增加全局变量真实意义,不容忽视

 

以上方法看似复杂,其实很简单,只不过是通过多事件的运行逻辑协同作战而已,为了避免上述错误,这个NetworkAddressChanged是我向贺老师专门提出来后增加上去的,早就解决了,只是大家没切身体会到他的好处而已!

 

如果您还需要您的程序严谨一点,可以在项目属性的BeforeOpenProject事件中加上如下代码,如果数据库无法连接,项目程序将拒绝打开:

If TryConnectHost(www.jinyt.com) ‘判断数据库服务器可用状态,这里为什么不用全局变量,大家想想就知道了
    e.Cancel = True
End If

 


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/17 18:08:00 [显示全部帖子]

反正我设置了这个以后,基本上没有出现什么问题了,如果是数据库用户名、端口、密码问题我没纳入到不在这个问题解决范畴!

那是在BeforeConnectOuterDataSource事件专门处理的!

 

……

    If Connections.TryConnect(s) = False Then
                MessageBox.Show("对不起,数据源无法连通,请联系超级管理员提供数据库链接文件!","提示",MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return
            Else
                e.ConnectionString = s
            End If
……


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/18 8:46:00 [显示全部帖子]

以下是引用blackzhu在2014-12-18 7:48:00的发言:
老大  你网络状态是什么类型,为啥上面赋值了 下面是逻辑类型了

您没仔细看吧?我第一歩就说的很清楚了:逻辑型

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/18 11:41:00 [显示全部帖子]

釆用SQL远程数据库的系统,经过上述处理后,您可以拔掉网线,也不会报错了,如果您的项目设计了FTP上传下载功能,同样方法判断之!

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/18 11:47:00 [显示全部帖子]

添加删除行是一个即时动作,过期要重复操作即可,有添加和删除行之前执行的事件,无需添加!

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/18 12:32:00 [显示全部帖子]

对了,对应的全局表事件好像应该在打开项目后针对性地开启!忘记了说了,晚上回来看再改帖!

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/18 19:38:00 [显示全部帖子]

晕,全局表事件本来就有BeforeSaveDataRow事件,和老师给归类到【数据】分类下面的,我居然没看见,这样就省很多事了,一楼有修正,各位不妨移步一楼再看看也无妨!

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/19 16:27:00 [显示全部帖子]

以下是引用rjh4078在2014-12-19 15:49:00的发言:

这个NetworkAddressChanged监测的是本机网络状态吧?如果是远程服务器掉线还是没办法的.特别是有防火墙的服务器TryConnectHost也是没用的,ping也是ping不上的。

 

您应该测试一下再下定义,NetworkAddressChanged是在获取服务期IP地址后,ip地址有了真实变化才执行,我现在的项目可以在无网络状态下而不报错,实实在在的东西分享给大家为什么不相信呢?


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/26 22:35:00 [显示全部帖子]

以下是引用L88919138在2014-12-26 8:55:00的发言:
程大师:

第二步:  NetworkAddressChanged事件代码

Vars("网络状态") = TryConnectHost(www.jinyt.com) '数据库服务器地址


最好还要在AFTEROPENPROJECT项目事件写入这个代码,实验时发现上次Vars("网络状态")执行事件结果好像会保存着(比如是FALSE),假设这次IP地址没变化可以连接远程数据库,但在执行增加、删除记录什么,仍提示“对不起,当前网络或服务器不可用......"错误,在AFTEROPENPROJECT项目事件写入后,能正常打开项目,Vars("网络状态") = true,就不影响正常操作。

 

嗯,应该是这个原理!


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/12/27 18:20:00 [显示全部帖子]

加载表的时候再针对性地启动该表所对应的全局表事件。


 回到顶部
总数 12 1 2 下一页