SQL Server보기에 연결된 MS 액세스
-
10-07-2019 - |
문제
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보기에는 부품이 표시되지 않습니다.