MS Access表单拒绝连接到SQL Express后端

时间:2012-08-18 11:56:28

标签: ms-access ms-access-2007 sql-server-2008-express

我有一个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

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

帮助这让我生气。

由于

罗杰

3 个答案:

答案 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_SCHEMATABLE_NAME来创建链接名称,并使用下划线(不是点)来加入它们。因此,代替dbo.Tablename作为链接名称,它将为您提供dbo_Tablename

如果您的表单只需要Tablename作为链接名称,那么您有两个选择:

  1. 修改表单的数据源属性以使用dbo_Tablename
  2. 更改代码,仅使用Tablename而非dbo_Tablename
  3. 命名链接

    您可以将代码更改为仅使用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

事实上,本地名称可能或多或少都是您想要的。