在链接到数据库的MS Access前端中未更新架构更改

时间:2014-05-21 19:05:49

标签: sql sql-server database ms-access

我使用SQL Server Management Studio在SQL Server中创建了一个新表,但是没有更新链接到数据库的MS Access前端。

我尝试重新打开Access但仍无法找到新表。然而,当我检查SQL Server数据库时,它们就在那里。

我在Access中的表链接到数据库,所以我假设任何表或SQL Server数据库中所做的更改都会反映在Access前端中。当我在Access中运行查询查找表时,找不到任何内容。另一点信息是,当我右键单击并按下视图依赖项时,它表示无法查看依赖项,因为

  

"无法转换' System.DBNull'输入   ' System.string'"

我保存查询的方式可能有问题,但我不确定。

2 个答案:

答案 0 :(得分:2)

你的假设:

  

我假设SQL Server数据库中的任何表或更改都会   反映在Access前端

... 不是正确。当SQL Server的架构发生更改时,Access不会自动重新链接,而实际上却无法重新链接。您期望Access假定SQL Server和Access之间的数据模型是相同的。即使您的表名和列名完全相同,仍然存在差异,因为数据类型存在一些差异。因此,即使在最佳情况下,Access也没有足够的信息来自动重新链接。

修改SQL Server数据库时,必须从Access重新链接。这里的an article with some code允许您快速执行此操作,但请注意您仍需手动启动它。请注意,如上所述,链接并不是那么简单。如果您使用自动方法进行链接,则必须做出一些决定,其中一些决定会让您感到意外。

答案 1 :(得分: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