문제

SQL Server를 데이터 저장소로 사용하도록 업그레이드하는 액세스 데이터베이스에 문제가 있습니다.

이 특정 데이터베이스는 2 개의 SQL 데이터베이스로 연결되어 있으므로 사물을 단순화하는 것으로 생각했습니다. 기본 데이터베이스에서 보조 데이터베이스의 각 테이블에 연결된 모습이 있습니다. 따라서 액세스는 하나의 SQL 데이터베이스와 직접 대화하면됩니다.

데이터베이스보기에 액세스를 연결했을 때 어떤 필드가 기본 키인지 선택하여 뷰가 읽히지 않았습니다. 데이터베이스가 변경되기 위해 모든 링크를 픽업 할 때 모든 링크를 새로 고치는 표준 코드가 있으며 기본 키 정보가 손실되면 링크 된 뷰가 읽히게됩니다.

기본 키 정보를 유지하면서보기로 링크를 새로 고칠 수있는 방법이 있습니까?

남자

도움이 되었습니까?

해결책

아래에 전체 ODBC 재 연결 기능을 포함 시켰습니다. 이 기능은 다시 연결하는 데 필요한 모든 정보를 저장하는 rtblodbc라는 테이블이 있다는 아이디어를 전제로합니다. 이 기능을 구현하는 경우 여러 SQL 데이터베이스에 연결하는 것에 대해 걱정할 필요가 없습니다. 각 테이블이 자체 연결 문자열로 다시 연결되도록 각 테이블에 부드럽게 처리됩니다.

당신이 끝날 때 당신은 내가 db.execute "create index"& smarkeykeyname & "on"& slocaltablename & "("& sprimarykeyfield & ")를 사용하여 DAO를 사용하여 기본 키를 재현하는 것을 볼 수 있습니다.

궁금한 점이 있으면 문의하십시오.

Public Function fnReconnectODBC( _
    Optional bForceReconnect As Boolean _
    ) As Boolean
    ' Comments  :
    ' Parameters: bForceReconnect -
    ' Returns   : Boolean -
    ' Modified  :
    ' --------------------------------------------------'

    On Error GoTo Err_fnReconnectODBC

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim tdf As DAO.TableDef
    Dim sPrimaryKeyName As String
    Dim sPrimaryKeyField As String
    Dim sLocalTableName As String
    Dim strConnect As String
    Dim varRet As Variant

    Dim con As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sSQL As String

    If IsMissing(bForceReconnect) Then

        bForceReconnect = False

    End If

    sSQL = "SELECT rtblODBC.LocalTableName, MSysObjects.Name, MSysObjects.ForeignName, rtblODBC.SourceTableName, MSysObjects.Connect, rtblODBC.ConnectString " _
         & "FROM MSysObjects RIGHT JOIN rtblODBC ON MSysObjects.Name = rtblODBC.LocalTableName " _
         & "WHERE (((rtblODBC.ConnectString)<>'ODBC;' & [Connect]));"

    Set con = Access.CurrentProject.Connection
    Set rst = New ADODB.Recordset

    rst.Open sSQL, con, adOpenDynamic, adLockOptimistic

        'Test the recordset to see if any tables in rtblODBC (needed tables) are missing from the MSysObjects (actual tables)
        If rst.BOF And rst.EOF And bForceReconnect = False Then

            'No missing tables identified
            fnReconnectODBC = True

        Else

            'Table returned information, we don't have a perfect match, time to relink
            Set db = CurrentDb
            Set rs = db.OpenRecordset("rtblODBC", dbOpenSnapshot)

                'For each table definition in the database collection of tables
                For Each tdf In db.TableDefs

                    'Set strConnect variable to table connection string
                    strConnect = tdf.Connect

                    If Len(strConnect) > 0 And Left(tdf.Name, 1) <> "~" Then

                        If Left(strConnect, 4) = "ODBC" Then

                            'If there is a connection string, and it's not a temp table, and it IS an odbc table
                            'Delete the table
                            DoCmd.DeleteObject acTable, tdf.Name

                        End If

                    End If

                Next

                'Relink tables from rtblODBC
                With rs

                    .MoveFirst

                    Do While Not .EOF

                        Set tdf = db.CreateTableDef(!localtablename, dbAttachSavePWD, !SourceTableName, !ConnectString)

                        varRet = SysCmd(acSysCmdSetStatus, "Relinking '" & !SourceTableName & "'")

                        db.TableDefs.Append tdf
                        db.TableDefs.Refresh

                        If Len(!PrimaryKeyName & "") > 0 And Len(!PrimaryKeyField & "") > 0 Then

                            sPrimaryKeyName = !PrimaryKeyName
                            sPrimaryKeyField = !PrimaryKeyField
                            sLocalTableName = !localtablename

                            db.Execute "CREATE INDEX " & sPrimaryKeyName & " ON " & sLocalTableName & "(" & sPrimaryKeyField & ")WITH PRIMARY;"

                        End If

                        db.TableDefs.Refresh

                        .MoveNext

                    Loop

                End With

            subTurnOffSubDataSheets

            fnReconnectODBC = True

        End If

    rst.Close
    Set rst = Nothing

    con.Close
    Set con = Nothing


Exit_fnReconnectODBC:

    Set tdf = Nothing
    Set rs = Nothing
    Set db = Nothing

    varRet = SysCmd(acSysCmdClearStatus)

    Exit Function

Err_fnReconnectODBC:

    fnReconnectODBC = False

    sPrompt = "Press OK to continue."
    vbMsg = MsgBox(sPrompt, vbOKOnly, "Error Reconnecting")
    If vbMsg = vbOK Then

        Resume Exit_fnReconnectODBC

    End If

End Function

다른 팁

SQL Server에 테이블을 다시 링크하는 DSN 적은 코드는 종종 링크를 먼저 삭제 한 다음 링크를 재현합니다. 그런 다음 코드는 연결 문자열을 설정합니다. 따라서, 기본 키가/IS의 것을 잃게 만드는 것은 삭제됩니다.

실제로 테이블 링크를 삭제하지 않도록 리 링크 코드를 수정하는 것이 좋습니다.

다음과 같은 것을 시도하십시오.

For Each tdfCurrent In dbCurrent.TableDefs
   If Len(tdfCurrent.Connect) > 0 Then
      If Left$(tdfCurrent.Connect, 5) = "ODBC;" Then
         strCon = "ODBC;DRIVER={sql server};" & _
           "SERVER=" & ServerName & ";" & _
           "DATABASE=" & DatabaseName & ";" & _
           "UID=" & UserID & ";" & _
           "PWD=" & USERpw & ";" & _
           "APP=Microsoft Office 2003;" & _
           "WSID=" & WSID & ";"
        End If
     End If
     tdfCurrent.Connect = strCon
     tdfCurrent.RefreshLink
  End If
Next tdfCurrent

이것은 나에게 더 잘 작동합니다 (이동 끝에 참고) :

Dim dbCurrent As Database
Set dbCurrent = CurrentDb()

StatusList.SetFocus
StatusList.AddItem ("starting... ")
I = DoEvents()
Dim tdfCurrent As DAO.TableDef
For Each tdfCurrent In dbCurrent.TableDefs
   If Len(tdfCurrent.Connect) > 0 Then
      If Left$(tdfCurrent.Connect, 5) = "ODBC;" Then
         strCon = "ODBC;DRIVER={sql server};" & _
           "SERVER=" & ServerName & ";" & _
           "DATABASE=" & DatabaseName & ";" & _
           "UID=" & UserID & ";" & _
           "PWD=" & USERpw & ";" & _
           "APP=Microsoft Office 2003;" & _
           "WSID=" & WSID & ";"

           StatusList.AddItem ("fixing " & tdfCurrent.Name)
        tdfCurrent.Connect = strCon
        tdfCurrent.RefreshLink
     End If
  End If
  I = DoEvents()
Next tdfCurrent

  StatusList.AddItem ("----Done.")

"ODBC"에도 불구하고 ODBC 수표는 정확합니다. msysobjects보기에는 부품이 표시되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top