鏈接表管理器(LTM)的問題是,當您鏈接到SQL視圖的鏈接表時。在這種情況下,LTM將重新鏈接「表格」而不重新分配適當的PK,並且它們將不可更新。 我已經寫過一些我從VBE開始的代碼,這是一個快速和骯髒的事情,但如果你需要它,你肯定會適應。 有兩個子表,一個用於表格,另一個用於passthru查詢。
Option Compare Database
option explicit
Const kOld = "remote.g" 'string to identify old server
'new server odbc string
Const kConnLux = "ODBC;DRIVER=SQL Server Native Client 10.0;SERVER=xxxx;UID=yyyy;PWD=zzzz;"
Sub UpdateTables()
Dim db As Database, td As TableDef
Dim hasIndex As Boolean, strSql As String
Set db = CurrentDb
For Each td In db.TableDefs
If InStr(1, td.Connect, kOld) > 0 Then 'lien vers CE serveur ?
If td.Name Like "dbo_vw*" And td.Indexes.count = 1 Then 'table = vue attachee --> pbl de clef primaire
strSql = "CREATE INDEX " & td.Indexes(0).Name & " ON [" & td.Name & "](" & td.Indexes(0).Fields & ")"
' convert field list from (+fld1;+fld2) to (fld1,fld2)
strSql = Replace(strSql, "+", "")
strSql = Replace(strSql, ";", ",")
hasIndex = True
Else
hasIndex = False
End If
td.Connect = kConnLux
td.RefreshLink
Debug.Print td.Name
If hasIndex And td.Indexes.count = 0 Then
' if index now removed then re-create it
CurrentDb.Execute strSql
End If
End If
Next td
Debug.Print "Done"
End Sub
Sub UpdateQueries()
Dim db As Database
Dim td As QueryDef
Set db = CurrentDb
For Each td In db.QueryDefs
If InStr(1, td.Connect, kOld) > 0 Then
td.Connect = kConnLux
Debug.Print td.Name, td.Connect
End If
Next td
End Sub
你看過鏈接表管理器嗎?應該有一個「保存密碼」複選框。如果它不可用,請參閱http://support.microsoft.com/?id=207823 – Fionnuala 2010-12-13 21:31:04
@Reemou,好主意,但鏈接到視圖的鏈接表存在問題。 – 2010-12-17 09:06:51
如果您沒有多個表,請刪除它們並在創建正確的DSN後重新附加它們。 – 2010-12-17 09:10:13