我有一个MS Access 2007前端和SQL Server Express后端。 (这最初来自Acces数据库)。
此数据库已从Production复制,并在不同的位置/域中运行到生产服务器。这用于开发。我有两个连接字符串,所以我可以在服务器/数据库之间切换。
我通过ODBC连接字符串连接MS Access链接表,使用SQL身份验证进行连接。
SQL用户具有dbowner权限/访问数据库
链接表刷新OK我可以打开表并修改前端表中的数据但是当我尝试打开标准的Access表单时,大多数都直接链接到表,我得到“连接失败.....服务器不存在或访问被拒绝“。 然后会出现一个带有orignal服务器名称的SQL Server登录框,而不是表当前连接到的服务器。
以下是供您参考的连接字符串: {Dim sLocalName As String Dim tdf As TableDef Dim rs As dao.Recordset
''This is a basic connection string, you may need to consider password and so forth
' cn = "ODBC;DSN=aid_dev;Trusted_Connection=No;APP=Microsoft Office 2007;DATABASE=aid_dev;"
cn = "ODBC;DRIVER=SQL Server;SERVER=KAL1\SQLEXPRESS;DATABASE=aid_dev;Uid=User;Pwd=Password"
''All fields fro`enter code here`m tables
strSQL = "SELECT TABLE_CATALOG, " _
& "TABLE_SCHEMA, " _
& "TABLE_NAME, " _
& "TABLE_TYPE " _
& "FROM [" & cn & "].INFORMATION_SCHEMA.tables " _
& "WHERE TABLE_TYPE = 'BASE TABLE'"
Set rs = CurrentDb.OpenRecordset(strSQL)
Do While Not rs.EOF
sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME
With CurrentDb
If DLookup("Name", "MSysObjects", "Name='" & sLocalName & "'") <> vbNullString Then
If .TableDefs(sLocalName).Connect <> cn Then
.TableDefs(sLocalName).Connect = cn
.TableDefs(sLocalName).RefreshLink
End If
Else
''If the table does not have a unique index, you will neded to create one
''if you wish to update.
Set tdf = .CreateTableDef(sLocalName)
tdf.Connect = cn
tdf.SourceTableName = rs!TABLE_NAME
.TableDefs.Append tdf
.TableDefs.Refresh
''This will produce a message box if the table does not have a unique index
''DoCmd.TransferDatabase acLink, "ODBC Database", cn, acTable, rs!TABLE_NAME, sLocalName
End If
End With
rs.MoveNext
Loop}
先谢谢
罗杰
编辑 - 发现问题但现在如何处理 我发现连接后,它实际上创建了指向SQL表的链接,但是作为dbo.Tablename。现在这会破坏所有报告,因为表单不指向dbo.tablenames而只指向表名。 原始链接仍然存在相同的原始连接属性。
1)如何更改原始表连接属性或2)如何将dbo.tablename重命名为tablename
或者我只是更改每个表单查询等.......
帮助这让我生气。
由于
罗杰
答案 0 :(得分:1)
这是我用来更改表名的函数。我在启动时运行它:
Public Sub subChangeLinkedTableNames()
Dim dbCurr As DAO.Database
Dim tdfCurr As DAO.TableDef
Set dbCurr = CurrentDb()
For Each tdfCurr In dbCurr.TableDefs
If Len(tdfCurr.Connect) > 0 Then
If Left(tdfCurr.Name, 4) = "dbo_" Then
tdfCurr.Name = Replace(tdfCurr.Name, "dbo_", "")
End If
End If
Next
Set tdfCurr = Nothing
Set dbCurr = Nothing
End Sub
我现在采用了另一种方法。每次加载数据库应用程序时,我都会删除所有现有的链接表并重新建立它们。我设计了自己的方法,我使用ADO连接连接到SQL Server,使用名为_LinkedTables的表加载ADO记录集。此表包含创建每个链接所需的信息,包括真实表名和LinkAs名称(这允许我使用不同的名称链接到表,对视图之类的内容很有帮助)。我还有一个包含主键字段名称的字段。
建立与SQL Server的初始ADO连接所需的信息包含在我的前端文件中的本地静态表中,该表称为tblDatabase。这里我有ADO和ODBC的连接字符串。我甚至编写了它,以便我可以使用不同的数据库进行开发与生产。
这一切都不是那么高级,因为它是一个相关的表格和代码网络,太多了,无法在此发布。
有些人只是在每次加载数据库时刷新链接,这样可以正常工作。我有一个非常具体的原因,我去删除和重新链接每个表,我不记得究竟是什么。我认为这与我在数据库上工作很多这一事实有关,我希望即使在现有的前端文件上也会尽快改变(如果我犯了错误)。我不想只重新链接现有的表链接,而是希望能够让用户关闭,重新打开并链接到一秒钟之前没有链接的表。但这确实是一种边缘情况,并且可能过度杀伤会导致相当多的额外加载时间。如果你有20张桌子就可以了。如果你有200,那可能不是一个好主意。
答案 1 :(得分:1)
“创建指向SQL表的链接,但是作为dbo.Tablename ”
请仔细检查这一点。该代码使用TABLE_SCHEMA
和TABLE_NAME
来创建链接名称,并使用下划线(不是点)来加入它们。因此,代替dbo.Tablename
作为链接名称,它将为您提供dbo_Tablename
。
如果您的表单只需要Tablename
作为链接名称,那么您有两个选择:
dbo_Tablename
Tablename
而非dbo_Tablename
您可以将代码更改为仅使用Tablename
作为此链接名称...
'sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME '
sLocalName = rs!TABLE_NAME
如果该代码不清楚这一点,当创建链接时,该链接数据将是只读的。如果您希望链接数据可以在使用它的表单中进行编辑,那么您还需要做更多的工作。
答案 2 :(得分:1)
代码从以下位置获取本地名称:
sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME
但您不必包含rs!TABLE_SCHEMA & "_" &
,这是“dbo_”的地方。
所以
sLocalName = rs!TABLE_NAME
事实上,本地名称可能或多或少都是您想要的。