Foxtable(狐表)用户栏目专家坐堂 → 多数据源问题求教


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

主题:多数据源问题求教

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


加好友 发短信
等级:二尾狐 帖子:515 积分:5039 威望:0 精华:0 注册:2017/9/1 23:28:00
多数据源问题求教  发帖心情 Post By:2021/9/16 12:58:00 [只看该作者]

是这样的,我的客户在总部办公室有三台电脑需要连接服务器,服务器在总部。然后有分公司通过类似花生壳的软件(nat123)远程访问总部服务器。为了提高效率,我设置两个数据源,一个用总部局域网访问,一个数据源用远程访问,但是测试下来不行,直接报错,发布后,系统会先连接第一个局域网的数据源,然后直接报错。如果只使用一个数据源(使用远程访问的虚拟域名和端口)是可以正常使用的,当然速度是很慢的。现在我想求教下怎么解决这个问题?让总部直接在局域网访问,然后让分公司用远程访问?

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/9/16 13:34:00 [只看该作者]

添加一个数据源,然后参考:http://www.foxtable.com/webhelp/topics/0682.htm
[此贴子已经被作者于2021/9/16 13:34:39编辑过]

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


加好友 发短信
等级:二尾狐 帖子:515 积分:5039 威望:0 精华:0 注册:2017/9/1 23:28:00
  发帖心情 Post By:2021/9/21 16:13:00 [只看该作者]

蓝老师好,我按照教程做了下面的修改:
1、系统原本有个局域网连接的数据源,名字叫gcerp。
2、首先添加一个远程的数据源,测试成功。
比如数据源名称叫“yuancheng”,连接字符串如下:Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=GC_ERP;Data Source=1234567.uttcare.com,9999

3、在BeforeConnectOuterDataSource事件中添加下面的代码:
If e.Name = "gcerp" Then
    If Network.Ping("192.168.1.201",1000) = False  Then '如果第一个IP无法接通
        e.Connec tion String = e.Connec tion String.Replace("192.168.1.201""
1234567.uttcare.com") '注:1234567.uttcare.com是虚拟域名的地址,已经做了端口映射。
    End If
End
 If

3、问题:无论怎么改,只要代码第一句是“If e.Name = "gcerp" Then” 那么系统启动的时候就非要连接第一个数据源不可,绝对不会切换到第二个数据源,系统会报错“连接GCERP错误,请联系管理员”然后直接退出。如果代码改为
If Network.Ping("192.168.1.201",1000) = False  Then '如果第一个IP无法接通
        e.Connec tion String = e.Connec tion String.Replace("192.168.1.201""
1234567.uttcare.com")
    End If
则出现“PING错误”详细信息为“不知道这样的主机”,然后尝试改为虚拟域名对应的IP地址,比如123.22.33.45
If Network.Ping("192.168.1.201",1000) = False  Then '如果第一个IP无法接通
        e.Connec tion String = e.Connec tion String.Replace("192.168.1.201""
123.22.33.45")
    End If
结果仍然相同“PING错误”详细信息为“不知道这样的主机”

4、最后没办法了,我直接修改第一个数据源的信息,把“yuancheng”数据源的信息强行复制粘贴到第一个数据源“gcerp”,并把BeforeConnectOuterDataSource事件中代码删除。连接远程数据库成功。

但是这样一来,我每更新一次都要发布两个不同连接的版本,另外,办公室的人经常要移动办公,切换数据源,非常麻烦。还是想请老师指点下BeforeConnectOuterDataSource事件的代码要怎么写?

另外说明下,教程中说的“注意此事件必须通过e.User来引用用户。”不知道有没有关系?我没有使用系统自带的用户管理功能,全部是自己写的用户管理代码。

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


加好友 发短信
等级:小狐 帖子:302 积分:2069 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2021/9/22 7:01:00 [只看该作者]

系统自带的用户管理太不灵活了。我是这么干的,C#写了一个DLL文件,简单封装一个登录窗口,窗口附加给出两个选项:服务器地址,web数据源/本地数据源
登录以后用C#窗口内的代码连接服务器,进行登录验证,根据选项给出不同的连接字符串。这样用户自己可以切换数据源。

登录调用在beforeopenproject事件当中。验证失败直接强行退出项目system.environment.exit(0)

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


加好友 发短信
等级:小狐 帖子:302 积分:2069 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2021/9/22 7:03:00 [只看该作者]

按这个思路试试吧,我用得很舒服。而且是先验证登录才给出数据源字符串(加密形式),比先连接数据源再验证登录更加安全。

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/9/22 9:58:00 [只看该作者]

去掉yuancheng这个数据源。

BeforeConnectOuterDataSource事件中添加下面的代码:
If e.Name = "gcerp" Then
    If Network.Ping("192.168.1.201",1000) = False  Then '如果第一个IP无法接通
        e.Connec tion String = e.Connec tion String.Replace("192.168.1.201""
1234567.uttcare.com,9999") '注:1234567.uttcare.com是虚拟域名的地址,已经做了端口映射。
    End If
End
 If

意思就是项目里只需要设置一个数据源,然后根据ip是否联的通,决定连接哪个IP的数据库

 回到顶部