如何以编程方式更新Access中的链接表,以便刷新数据类型?

时间:2013-06-07 22:09:51

标签: ms-access access-vba linked-tables

我正在使用我们最近更新的旧版Microsoft Access数据库,以使用链接表/ SQL Server后端。

我正在对数据结构进行一些更改,并希望以编程方式更新链接表引用。

然而,使用我正在使用的代码,在做了我期望的刷新链接表后,我没有得到特定表的更新数据类型。现在数据类型是Text,但如果我使用外部数据>链接表管理器并完成他们更新到日期/时间的过程。

(我希望有一个能在开发和制作之间翻转的功能,所以我不认为上面的路线是一个选项。)

Access / VB不再是我最强的技能了,但是从MSDN(thisthis)看起来似乎需要tb.Fields.Refresh,但它不能正常工作期待。

我做错了什么?

Function RefreshLinkedTables() As Boolean
    Dim db As DAO.Database
    Dim tb As DAO.TableDef
    Dim fld As DAO.Field

    Set db = CurrentDb

    For Each tb In db.TableDefs
        ' Skip system files.
        If (Mid(tb.Name, 1, 4) <> "MSys" And Mid(tb.Name, 1, 4) <> "~TMP") Then
            Debug.Print tb.Name
            Debug.Print tb.Connect
            If (Mid(tb.Connect, 1, 5) = "ODBC;") Then
                tb.RefreshLink
                If (tb.Name = "Jobs") Then
                    Debug.Print "Refreshing fields data"
                    tb.Fields.Refresh
                End If
            End If
            Debug.Print "=== === ==="
        End If
        db.TableDefs.Refresh
    Next

    Set db = Nothing

    RefreshLinkedTables = True
    Exit Function
End Function

1 个答案:

答案 0 :(得分:2)

有一些事情导致了奇怪的行为。

首先,链接表最初使用的是SQL Server驱动程序,而不是SQL Server Native Client 10.0驱动程序。所以,当我刷新表格时,我选择了不正确的表格(我知道它不是11.0,但认为它是10.0)。

第二个问题是,当Access表转换为SQL Server时,datetime字段设置为datetime2(0)(使用了Access 2010迁移工具)。不幸的是SQL Server驱动程序不支持这些。

我们希望用户通过Windows身份验证进行身份验证(同样,遗留应用程序有望在一天内转移到网络或第三方解决方案),我们知道它的工作方式也是如此。

在更改SQL Server表以使用datetime而不是datetime2之后,下面的代码运行得很好:

Option Compare Database
Option Explicit

Function RefreshLinkedTables() As Boolean
    Dim db As DAO.Database
    Dim tb As DAO.TableDef

    Set db = CurrentDb

    For Each tb In db.TableDefs
        ' Skip system files.
        If (Mid(tb.Name, 1, 4) <> "MSys" And Mid(tb.Name, 1, 4) <> "~TMP") Then
            Debug.Print tb.Name
            Debug.Print tb.Connect
            If (Mid(tb.Connect, 1, 5) = "ODBC;") Then
                'We only need to refresh a single table.
                If (tb.Name = "Jobs") Then
                    tb.Connect = tb.Connect & ""
                    'Live connection
                    'tb.Connect = "ODBC;Description=___;DRIVER=SQL Server;SERVER=___;APP=Microsoft Office 2010;DATABASE=___"
                    'Dev connection
                    'tb.Connect = "ODBC;Description=___;DRIVER=SQL Server;SERVER=___;APP=Microsoft Office 2010;DATABASE=___"
                    tb.RefreshLink
                End If
                'tb.RefreshLink
            End If
            Debug.Print "=== === ==="
        End If
    Next
    db.TableDefs.Refresh

    Set db = Nothing

    RefreshLinkedTables = True
    Exit Function
End Function

逻辑可以被清理一点,但它可以工作。

感谢Gord Thompson的有益评论。