我正在使用我们最近更新的旧版Microsoft Access数据库,以使用链接表/ SQL Server后端。
我正在对数据结构进行一些更改,并希望以编程方式更新链接表引用。
然而,使用我正在使用的代码,在做了我期望的刷新链接表后,我没有得到特定表的更新数据类型。现在数据类型是Text,但如果我使用外部数据>链接表管理器并完成他们更新到日期/时间的过程。
(我希望有一个能在开发和制作之间翻转的功能,所以我不认为上面的路线是一个选项。)
Access / VB不再是我最强的技能了,但是从MSDN(this和this)看起来似乎需要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
答案 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的有益评论。