链接到数据库的 MS Access 前端未更新架构更改
Posted
技术标签:
【中文标题】链接到数据库的 MS Access 前端未更新架构更改【英文标题】:Schema changes not updated in MS Access front end linked to the database 【发布时间】:2014-05-21 19:05:49 【问题描述】:我使用 SQL Server Management Studio 在 SQL Server 中创建了一个新表,但链接到数据库的 MS Access 前端没有更新。
我尝试重新打开 Access,但仍然找不到新表。然而,当我检查 SQL Server 数据库时,它们就在那里。
我在 Access 中的表已链接到数据库,因此 我假设在 SQL Server 数据库中所做的任何表或更改都会反映在 Access 前端中。当我在 Access 中运行查询以查找表时,什么也找不到。另一个信息是当我右键单击并按查看依赖项时,它说无法查看依赖项,因为
“无法将 'System.DBNull' 类型的对象转换为类型 'System.string'"
我保存查询的方式可能有问题,但我不确定。
【问题讨论】:
你所说的“查询”是什么意思......但是你说的是“新表”。您是说您使用 Management Studio 创建了新表吗?而 Access 只是看不到那些新表? 如果您列出您正在使用的 SQL Server 和 Access 的版本,这可能会有所帮助。 对不起,我在访问前端做了一个查询,基本上说 SELECT * FROM newtablename,看看我是否可以使用该查询拉出新表。我得到了添加表的 SQL 代码,我想我必须通过查询来实现它。如果它有助于其中一个新表的代码是: 根据我在下面的回答,您需要做的就是再次运行链接过程。你所期待的不会自动发生。 Access 的版本是 2010,SQL 管理工作室是 2008 @Paul Sasik 【参考方案1】:你的假设:
我假设在 SQL Server 数据库中所做的任何表或更改都会 体现在Access前端
...不正确。当 SQL Server 的架构更改时,Access 不会自动重新链接,而且确实不能。您期望 Access 假定 SQL Server 和 Access 之间的数据模型是相同的。即使您的表名和列名完全相同,仍然存在差异需要处理,因为数据类型存在一些差异。因此,即使在最好的情况下,Access 也没有足够的信息来自动重新链接。
当您修改 SQL Server 数据库时,您必须从 Access 重新链接。这是an article with some code,它可以让您快速完成此操作,但请注意您仍然必须手动启动它。请注意,如上所述,链接并不是那么简单。如果您使用自动化方法来链接流程,则必须做出一些决定,其中一些会让您感到意外。
【讨论】:
我完成了重新链接过程,但表格仍然没有出现。您认为这可能与我尝试查看依赖项时发生的错误有关吗? 没有。您是否在重新链接过程中看到了新的 SQL Server 表?如果您只是运行重新链接,该过程将只更新您已经链接的表。 我是否在 access 中手动创建表,然后链接到 SQL 数据库中的表? @VictoriaJay 如果其中一个答案有帮助,请将其标记为已接受的答案。如果您找到其他答案,请发布并接受它。【参考方案2】:我发现管理访问中的链接表在管理上很繁琐。为了让我的生活更简单,我使用了下面可以调用的函数来更新访问中的链接表。这将负责更新 SQL 中任何已更改表的结构。向 SetTableNames 函数添加值将引入新表
Private mstrTableNames(100) As String
Private const gcSQLDB as string = "mysqlServer"
Private const gcUserID as string = "SQLUserName"
Private const gcUserPassword as string = "SQLPassword"
Private const gcLiveDSN as string = "DSN"
Private const gcEmpty as string = ""
Public Function LinkLiveTables() As Boolean
Dim tdfLinked As TableDef
Dim strConnect As String
Dim intLoop As Integer
'Remove all non system tables from the application:
' !!!NB Add other exclusions so as to not delete tables that are not linked!!!
For Each tdfLinked In CurrentDb.TableDefs
If Left(tdfLinked.Name, 2) <> "MS" Then
If Left(tdfLinked.Name, 7) <> "tblTemp" Then
CurrentDb.TableDefs.Delete tdfLinked.Name
End If
End If
Next
'Create a linked table that points to SQL Server
strConnect = "ODBC;DATABASE=" & gcSQLDB & ";UID=" & gcUserID & _
";PWD=" & gcUserPassword & ";DSN=" & gcLiveDSN
SetTablesNames
For intLoop = 1 To 100
If mstrTableNames(intLoop) = gcEmpty Then GoTo ProcExit
Set tdfLinked = CurrentDb.CreateTableDef(mstrTableNames(intLoop))
With tdfLinked
.Connect = strConnect
.SourceTableName = "dbo." & mstrTableNames(intLoop)
End With
CurrentDb.TableDefs.Append tdfLinked
Next
ProcExit:
MsgBox "Connection to the LIVE tables was successful.", vbInformation
Exit Function
ProcError:
MsgBox "Link to LIVE tables Failed." & vbCrLf & vbCrLf & _
"Error Number : " & Err.number & vbCrLf & _
"Error Description : " & Err.Description, vbCritical
End Function
Private Sub SetTablesNames()
mstrTableNames(1) = "tblMoistureHist"
mstrTableNames(2) = "tblRawMaterials"
' ... add the additional table that you need as mstrTableNames(n) = "tablename"
End Sub
【讨论】:
以上是关于链接到数据库的 MS Access 前端未更新架构更改的主要内容,如果未能解决你的问题,请参考以下文章
如何在拆分数据库中将表从前端链接到后端(MS Access 2010)
MS-Access/SQL 拆分:如果我将其移动到不同的文件夹,前端安全性会发生变化