链接到数据库的 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 无法链接到加密的后端数据库

MS Access 前端无法使用加密的后端打开

MS-Access/SQL 拆分:如果我将其移动到不同的文件夹,前端安全性会发生变化

使用 ODBC 链接到 MySql 时,MS Access 表单不刷新

MS Access 2010:未绑定的组合框不会更新