更改无DSN访问前端的SQL连接信息

时间:2012-04-24 16:53:25

标签: sql-server ms-access connection-string ms-access-2003 database-migration

我有一个任务关键型Access 2003数据库,它使用Microsoft SQL Server数据库迁移助手(SSMA)软件从MS SQL Server 2005上的本地MDB更改为带有后端的MDB前端。

现在,我需要永久性地将表格链接到的服务器从(即将更改)更改为指向同一服务器的主机名 。服务器本身不会改变,只是连接字符串。

这是一个无DSN连接,因此ODBC信息包含在Access MDB文件中。如果我尝试刷新Access中的表链接,它会提示我输入DSN(我不想使用)。

我已经完成了一些谷歌搜索,并且每次程序启动时我都会找到几个代码片段让它自动更新。但是,我担心这可能会给用户带来问题或延迟。这是我最好的选择,还是有一些技巧可以永久更改存储在MDB中的连接字符串?

2 个答案:

答案 0 :(得分:1)

您可以使用VBA更改已关联的.Connect的{​​{1}}属性。

从立即窗口中查看此示例。 (我使用TableDef只是为了分割那条长行。)

Replace()

因此,我可以使用不同的SERVER构建一个新字符串,并将新字符串分配给? Replace(CurrentDb.TableDefs("remote_table").Connect, ";", ";" & vbCrLf) ODBC; DRIVER=SQL Server Native Client 10.0; SERVER=HP64\SQLEXPRESS; Trusted_Connection=Yes; APP=Microsoft Office 2003; WSID=WIN732B; DATABASE=testbed; 属性。

如果要进行永久性更改,您只需要执行一次,而不是每次打开数据库时都这样做。

当我完成类似的连接更改时,它位于不同的服务器之间。所以我删除了TableDef并重新创建它,以确保Access没有保留任何有关该连接的缓存元信息,这些信息现在已经过时了。但是,在您的情况下,您正在处理相同的物理服务器,只是通过名称而不是IP来引用它。我怀疑缓存的信息对你来说是一个问题。

答案 1 :(得分:1)

以下代码多年来一直很好用:

Function LinkTable(DbName As String, SrcTblName As String, _
                   Optional TblName As String = "", _
                   Optional ServerName As String = DEFAULT_SERVER_NAME, _
                   Optional DbFormat As String = "ODBC") As Boolean
Dim db As dao.Database
Dim TName As String, td As TableDef

    On Error GoTo Err_LinkTable

    If Len(TblName) = 0 Then
        TName = SrcTblName
    Else
        TName = TblName
    End If

    'Do not overwrite local tables.'
    If DCount("*", "msysObjects", "Type=1 AND Name=" & Qt(TName)) > 0 Then
        MsgBox "There is already a local table named " & TName
        Exit Function
    End If

    Set db = CurrentDb
    'Drop any linked tables with this name'
    If DCount("*", "msysObjects", "Type In (4,6,8) AND Name=" & Qt(TName)) > 0 Then
        db.TableDefs.Delete TName
    End If

    With db
        Set td = .CreateTableDef(TName)
        td.Connect = BuildConnectString(DbFormat, ServerName, DbName)
        td.SourceTableName = SrcTblName
        .TableDefs.Append td
        .TableDefs.Refresh
        LinkTable = True
    End With

Exit_LinkTable:
    Exit Function
Err_LinkTable:
    'Replace following line with call to error logging function'
    MsgBox Err.Description
    Resume Exit_LinkTable
End Function



Private Function BuildConnectString(DbFormat As String, _
                                    ServerName As String, _
                                    DbName As String, _
                                    Optional SQLServerLogin As String = "", _
                                    Optional SQLServerPassword As String = "") As String
    Select Case DbFormat
    Case "NativeClient10"
        BuildConnectString = "ODBC;" & _
                             "Driver={SQL Server Native Client 10.0};" & _
                             "Server=" & ServerName & ";" & _
                             "Database=" & DbName & ";"
        If Len(SQLServerLogin) > 0 Then
            BuildConnectString = BuildConnectString & _
                                 "Uid=" & SQLServerLogin & ";" & _
                                 "Pwd=" & SQLServerPassword & ";"
        Else
            BuildConnectString = BuildConnectString & _
                                 "Trusted_Connection=Yes;"
        End If

    Case "ADO"
        If Len(ServerName) = 0 Then
            BuildConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                 "Data Source=" & DbName & ";"
        Else
            BuildConnectString = "Provider=sqloledb;" & _
                                 "Server=" & ServerName & ";" & _
                                 "Database=" & DbName & ";"
            If Len(SQLServerLogin) > 0 Then
                BuildConnectString = BuildConnectString & _
                                     "UserID=" & SQLServerLogin & ";" & _
                                     "Password=" & SQLServerPassword & ";"
            Else
                BuildConnectString = BuildConnectString & _
                                     "Integrated Security=SSPI;"
            End If
        End If
    Case "ODBC"
        BuildConnectString = "ODBC;" & _
                             "Driver={SQL Server};" & _
                             "Server=" & ServerName & ";" & _
                             "Database=" & DbName & ";"
        If Len(SQLServerLogin) > 0 Then
            BuildConnectString = BuildConnectString & _
                                 "Uid=" & SQLServerLogin & ";" & _
                                 "Pwd=" & SQLServerPassword & ";"
        Else
            BuildConnectString = BuildConnectString & _
                                 "Trusted_Connection=Yes;"
        End If
    Case "MDB"
        BuildConnectString = ";Database=" & DbName
    End Select
End Function


Function Qt(Text As Variant) As String
Const QtMark As String = """"
    If IsNull(Text) Or IsEmpty(Text) Then
        Qt = "Null"
    Else
        Qt = QtMark & Replace(Text, QtMark, """""") & QtMark
    End If
End Function