3

Microsoft SQL Server Database Migration Assistant (SSMA) ソフトウェアを使用して、ミッション クリティカルな Access 2003 データベースをローカル MDB から、MS SQL Server 2005 上のバックエンドを備えた MDB フロントエンドに変更しました。

ここで、テーブルがリンクされているサーバーを、IP アドレス(間もなく変更されます)から、同じサーバーを指すホスト名に永続的に変更する必要があります。サーバー自体は変更されておらず、接続文字列のみが変更されています。

これは DSN を使用しない接続であるため、ODBC 情報は Access MDB ファイル内に含まれています。Access 内でテーブル リンクを更新しようとすると、DSN の入力を求められます (これは使用したくありません)。

私はいくつかのグーグルを行いました.プログラムが起動するたびにそれ自体を更新するためのコードのスクラップをいくつか見つけました. しかし、それがユーザーに問題や遅延をもたらす可能性があるのではないかと心配しています. それが私の最善の選択肢ですか、それとも MDB 内に保存されている接続文字列を永続的に変更するためのトリックはありますか?

4

2 に答える 2

1

VBA を使用.Connectして、リンクされたTableDefのプロパティを変更できます。

イミディエイト ウィンドウからこのサンプルを参照してください。(私はReplace()単にその長い行を分割していました。)

? 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 .Connectプロパティに割り当てることができました。

これが永続的な変更を意図している場合は、データベースを開くたびに行うのではなく、一度だけ行う必要があります。

同様の接続変更を行ったとき、それは異なるサーバー間で行われました。そのため、TableDef を削除して新たに再作成し、Access がその接続に関するキャッシュされたメタ情報を保持していないことを確認しました。ただし、あなたの場合、同じ物理サーバーを扱っており、IP ではなく名前で参照しているだけです。キャッシュされた情報が問題になるとは思えません。

于 2012-04-24T17:11:34.287 に答える
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
于 2012-04-24T17:15:25.163 に答える