以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  sql数据源设置问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=177173)

--  作者:bailing
--  发布时间:2022/5/11 17:46:00
--  sql数据源设置问题
前提:服务器有多个ip,设置ConnectionString里面的ip默认是192.168.0.150;

在打开项目的时候,
project有个ip的txt文件,如果文件有内容(我电脑上的时192.168.1.150),则用文件里面的ip替换掉192.168.0.150;
如果没有则换192.168.1.150以及192.168.111.150尝试连接

我这个项目在打开的时候能正常连接,加载数据,但是在开发界面>>外部数据表,管理外部数据表的时候提示无法连接,
查看设置的ConnectionString仍然是192.168.0.150,然后报错如下,我该怎么解决

ps:更新版本前好像没有遇到这样的问题


图片点击可在新窗口打开查看此主题相关图片如下:snipaste_2022-05-11_17-25-03.png
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2022/5/12 8:27:00
--  
数据源设置的代码发上来看看
--  作者:bailing
--  发布时间:2022/5/12 9:17:00
--  

BeforeConnectOuterDataSource事件代码

Dim ipFile As String = e.ProjectPath & "ip.txt"
If e.Name = "foxtable人事数据库" OrElse e.name = "foxtable" OrElse e.name = "mirror" Then
    Dim ip As String = FileSys.ReadAllText(ipFile)
    If ip <> "" Then
        e.ConnectionString = e.ConnectionString.Replace("192.168.0.150",ip)
    Else 
        If Connections.TryConnect(e.ConnectionString) Then \'如果第一个IP接通
            filesys.WriteAllText(e.projectpath & "ip.txt","192.168.0.150",False)
            
        Else If Connections.TryConnect(e.ConnectionString.Replace("192.168.0.156", "192.168.1.150")) Then \'如果第一个IP接通
            filesys.WriteAllText(e.projectpath & "ip.txt","192.168.1.150",False)
            e.ConnectionString = e.ConnectionString.Replace("192.168.0.150","192.168.1.150")
            
        Else If Connections.TryConnect(e.ConnectionString.Replace("192.168.0.150", "192.168.111.150")) Then
            filesys.WriteAllText(e.projectpath & "ip.txt","192.168.111.150",False)
            e.ConnectionString = e.ConnectionString.Replace("192.168.0.150","192.168.111.150")
            
        End If
    End If

连接字符串:
Provider=SQLOLEDB.1;Password=********;Persist Security Info=True;User ID=fox_user;Initial Catalog=mirror;Data Source=192.168.0.150

--  作者:有点蓝
--  发布时间:2022/5/12 9:50:00
--  
试试。测试通过后自己去掉调试代码,如果不通,把调试结果发上来看看

Dim ipFile As String = e.ProjectPath & "ip.txt"
If e.Name = "foxtable人事数据库" OrElse e.name = "foxtable" OrElse e.name = "mirror" Then
    MsgBox("数据源=" & e.Name)
    Dim ip As String
    Dim lst As New List(Of String)
    lst.AddRange({"", "192.168.0.150", "192.168.1.150", "192.168.111.150"})
    If Filesys.FileExists(ipFile) Then
        ip = FileSys.ReadAllText(ipFile)
        lst(0) = ip
        MsgBox("文件记录的是" & ip)
    End If 
    Dim cs As String = e.ConnectionString
    For Each s As String In lst
        If s > "" Then
            Dim s1 As String = cs.Replace("192.168.0.150", s)
            MsgBox("测试连接:" & s)
            If Connections.TryConnect(s1) Then
                e.ConnectionString = s1
                filesys.WriteAllText(e.projectpath & "ip.txt", s, False)
                MsgBox("连接成功:" & s)
                Exit For
            End If
        End If
    Next 
End If

--  作者:bailing
--  发布时间:2022/5/12 10:03:00
--  
老师,您给的代码测试能通,能正常进入项目且加载数据,但是在开发界面>>外部数据表,管理外部数据表的时候报一样的错误
--  作者:bailing
--  发布时间:2022/5/12 10:24:00
--  
虽然管理外部数据表的时候报错,但是能正常执行sql
--  作者:有点蓝
--  发布时间:2022/5/12 10:29:00
--  
菜单里的数据源是不会变的,只会显示初始的设置,不会根据代码的设置变化的
--  作者:bailing
--  发布时间:2022/5/12 10:31:00
--  
刚才用正确的ip添加了一个新的数据源,管理外部表窗口的时候,选择其他数据源还是会报错,但是选择这个含正确ip的就不会
--  作者:有点蓝
--  发布时间:2022/5/12 10:36:00
--  
仔细理解一下7楼。
--  作者:bailing
--  发布时间:2022/5/12 10:49:00
--  
那我在使用外部数据源/管理外部表的时候,得把连接字符串改掉?