我有一个Access 2003数据库,其中包含指向SQL Server 2005数据库的链接表。最近更新了用于在Access和SQL Server之间创建ODBC连接的用户信息(密码)。
当我打开Access数据库并尝试编辑链接表信息时,我可以打开表并查看我的数据。但是,当我关闭Access并重新打开Access数据库时,似乎密码通知已经回敬,我收到ODBC连接错误。
任何人都知道我做错了什么?
作为后续行动,我们看来我们有大约十几个Access数据库,其中包含许多需要此更新的链接表。这是更新此信息的最佳方式吗?链接表似乎是使用不同的计算机创建的,因为ODBC连接中指定的Workstation-ID不同。
答案 0 :(得分:0)
编写一个例程,从TableDef更新Connect属性并使用RefreshLink保存更改。
答案 1 :(得分:0)
链接表管理器(LTM)的问题在于,您链接的表实际上是SQL视图的链接。在这种情况下,LTM将重新链接“表”而不重新分配适当的PK,它们将变为不可更新。 我已经编写了一些我以前从VBE开始的代码,它是一个快速而又脏的东西,但如果你需要的话,你肯定可以适应它。 有2个子,一个用于表,一个用于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