我使用SQL Server Management Studio在SQL Server中创建了一个新表,但是没有更新链接到数据库的MS Access前端。
我尝试重新打开Access但仍无法找到新表。然而,当我检查SQL Server数据库时,它们就在那里。
我在Access中的表链接到数据库,所以我假设任何表或SQL Server数据库中所做的更改都会反映在Access前端中。当我在Access中运行查询查找表时,找不到任何内容。另一点信息是,当我右键单击并按下视图依赖项时,它表示无法查看依赖项,因为
"无法转换' System.DBNull'输入 ' System.string'"
我保存查询的方式可能有问题,但我不确定。
答案 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