【问题标题】:Editing Linked Table Information In Access 2003在 Access 2003 中编辑链接表信息
【发布时间】:2010-12-13 21:04:44
【问题描述】:

我有一个 Access 2003 数据库,其中包含指向 SQL Server 2005 数据库的链接表。最近更新了用于在 Access 和 SQL Server 之间创建 ODBC 连接的用户信息(密码)。

当我打开 Access 数据库并尝试编辑链接表信息时,我可以打开表并查看我的数据。但是,当我关闭 Access 并重新打开 Access 数据库时,密码信息似乎已恢复,并且出现 ODBC 连接错误。

有人知道我做错了什么吗?

作为后续,我们似乎有十几个 Access 数据库,其中包含大量链接表,都需要此更新。这是更新此信息的最佳方式吗?链接表似乎是使用不同的机器创建的,因为 ODBC 连接中指定的 Workstation-ID 不同。

【问题讨论】:

  • 你看过链表管理器吗?应该有一个“保存密码”复选框。如果不可用,请参阅support.microsoft.com/?id=207823
  • @Reemou,好主意,但链接到视图的链接表存在问题。
  • 如果您没有很多表,请删除它们并在创建正确的 DSN 后重新附加它们。
  • 您使用 SQL Server 身份验证而不是 Windows 身份验证是否有原因?在这方面使用后者要容易得多——您的 Access 应用程序将不再需要关心用户身份验证问题。

标签: ms-access odbc


【解决方案1】:

编写一个例程,从 TableDef 更新 Connect 属性并使用 RefreshLink 保存更改。

【讨论】:

  • 一般来说,对于 ODBC 链接表,最好删除并重新创建链接表,因为这样可以确保所有元数据都是最新的。
【解决方案2】:

链接表管理器 (LTM) 的问题在于,链接表实际上是指向 SQL 视图的链接。在这种情况下,LTM 将重新链接“表”而不为它们重新分配正确的 PK,并且它们将变得不可更新。 我写了一些我以前从 VBE 开始的代码,这是一件快速而肮脏的事情,但如果你需要它,你肯定可以适应它。 有 2 个 subs,一个用于表,一个用于 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

【讨论】:

  • 对于 ODBC 链接表,我从不刷新 TableDef 的连接字符串,而是删除它们并从头开始重新创建它们,因为这样可以保证元数据是最新的(缺少哪个更新是导致视图不可更新的原因)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2010-12-03
  • 1970-01-01
相关资源
最近更新 更多