2

我有一个 MS Access 2007 前端和 SQL Server Express 后端。(这最初是从访问数据库中扩大的)。

此数据库已从生产复制并在与生产服务器不同的位置/域中运行。这用于开发。我有两个连接字符串,所以我可以在服务器/数据库之间切换。

我通过 ODBC 连接字符串连接 MS Access 链接表,使用 SQL 身份验证进行连接。

SQL 用户拥有对数据库的 dbowner 权限/访问权限

链接表刷新正常,我可以在前端打开表并修改表中的数据,但是当我尝试打开标准 Access 表单时,大部分都直接链接到表,我得到“连接失败... .. 服务器不存在或访问被拒绝”。然后会出现一个带有原始服务器名称的 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

还是我只是更改每个表单查询等......

帮助这让我发疯。

谢谢

罗杰

4

3 回答 3

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 个,那可能不是一个好主意。

于 2012-08-18T14:44:58.007 回答
1

"创建到 SQL 表的链接,但作为 dbo.Tablename "

请仔细检查这一点。该代码使用TABLE_SCHEMAandTABLE_NAME创建链接名称,并使用下划线(不是点)来连接它们。因此dbo.Tablename,它不会作为链接名称,而是为您提供dbo_Tablename.

如果您的表单期望Tablename作为链接名称,您有 2 个选择:

  1. 修改表单的数据源属性以使用dbo_Tablename
  2. 更改代码以将链接命名为 justTablename而不是dbo_Tablename

您可以更改代码以Tablename像这样使用链接名称...

'sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME '
sLocalName = rs!TABLE_NAME

如果该代码不清楚这一点,则在创建链接时,该链接数据将是只读的。如果您希望链接数据在使用它的表单中是可编辑的,那么您还有更多工作要做。

于 2012-08-18T15:44:52.747 回答
1

代码从以下位置获取本地名称:

 sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME

但是您不必包含rs!TABLE_SCHEMA & "_" &,这是它获得“dbo_”的地方。

所以

 sLocalName = rs!TABLE_NAME

实际上,本地名称或多或少可以是您喜欢的任何名称。

于 2012-08-18T20:31:36.927 回答