1

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

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

但是,使用我正在使用的代码,在完成我期望刷新链接表的操作后,我没有获得特定表的更新数据类型。现在数据类型是文本,但如果我使用外部数据 > 链接表管理器并完成该过程,它们会更新为日期/时间。

(我想要一个可以在开发和生产之间切换的功能,所以我不认为上述路线是一种选择。)

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
4

1 回答 1

2

有几件事导致了奇怪的行为。

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

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

我们希望用户通过 Windows 身份验证进行身份验证(同样,希望有朝一日会迁移到 Web 或第三方解决方案的遗留应用程序),我们知道它以这种方式工作。

将 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 的有益评论。

于 2013-06-11T16:29:53.540 回答