【问题标题】:Programmatically creating linked tables in access以编程方式在访问中创建链接表
【发布时间】:2010-03-11 16:20:33
【问题描述】:

我们需要找到一种方法来以编程方式将 SQL Server 数据库中的所有表链接到访问数据库。我们将从使用 .net/SQL Server 2008 的程序中调用此访问数据库。

在调用应用程序时,我们希望添加链接表,以便用户可以通过访问运行报告/模块,而不必担心链接表。我们有办法做到这一点吗?

【问题讨论】:

    标签: sql-server ms-access


    【解决方案1】:

    这里有一些注释。

    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=TheDSNName;Trusted_Connection=Yes;APP=Microsoft Office 2010;DATABASE=TheDatabaseName;"
    
    ''All fields from 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
    

    【讨论】:

      【解决方案2】:

      您需要与 SQL 数据库建立 ODBC 连接。准备好此连接后,您可以将其用于要链接的所有表:

      DoCmd.TransferDatabase acLink, _
                             "ODBC Database", _
                             myODBCconnection, _
                             myDatabaseName, _
                             acTable, _
                             myTableName
      

      我猜您可以“即时”声明您的 ODBC 连接器,例如建议 here

      要枚举您的表,您有以下选项:

      • 在代码中枚举它们:每个表一个 transferDatabase 行
      • 将表名保存在本地表中,然后浏览表
      • 将表名保存在网络上任何位置的文件(文本、xml)中并浏览文件
      • 访问保存表列表的服务器上的系统表,并浏览表
      • 使用 ADOX 对象浏览数据库服务器中的所有表:注意不要包括系统表。此解决方案可能也很混乱,因为您必须先打开与数据库的 ADODB 连接,然后再使用 ODBC 连接打开表

      在所有情况下,此过程都应使用 autoexec 宏启动,这意味着每次用户打开 mdb 客户端时都会创建\更新链接。

      【讨论】:

      • 除了最后一段外,答案很好。我会说这取决于所涉及的应用程序是否每次打开应用程序时都运行代码。在许多情况下,它应该只需要运行一次,即当您想要连接到不同的 SQL Server 数据库时,而不是每次应用加载时。
      • 如果要连接的表没有主键或唯一索引,TransferDatabase 将打开一个弹出窗口,甚至从代码运行。
      • @david:只要表格列表无法更新,您的建议就是正确的。如果开发人员希望能够在不更改客户端的情况下更改链接表(即通过 ADOX 对象、xml 文件等知道表名),则必须在每次应用程序启动时启动“链接过程”。
      • @Remou:没有主键的表?你在跟我开玩笑!还允许吗?
      【解决方案3】:

      您将use ADOX 进行实际链接。

      就枚举您所连接的数据库中的表而言,您可以执行一些简单的操作,例如针对您的 SQL Server 运行此查询,但是有很多方法可以给这只猫换皮:

      SELECT * FROM INFORMATION_SCHEMA.TABLES
      

      【讨论】:

        【解决方案4】:

        您可以通过在 SQL Server 中使用指向 Access db 的链接服务器来实现等效功能。这将使您可以访问 Access db 中的所有表,以便您可以像这样引用它们:

        Select ..
        From [LinkedServerName]...[AccessTableName]
        

        顺便说一句,链接服务器可能对你想要的东西来说太过分了。查看 OPENROWSET 函数,它可以有效地让您传递连接字符串。

        编辑:我最初读到这个问题的字面意思是“链接表 in SQL Server to 访问”,我将其翻译为从 SQL 到 Access 的意思。因此,鉴于此,我的解决方案将适用。但是,如果希望从 Access 转到 SQL,那就不同了,其他解决方案会更合适。

        【讨论】:

        • 我想你是倒着读问题的(我最初也是这样做的)。 OP 说他需要从 .NET 运行 Access 应用程序,而不是使用 SQL Server 访问存储在 Jet/ACE 数据文件中的数据。但它的措辞相当混乱,我同意。
        • 你是对的。删除我的帖子是正确的解决方案吗?
        • 我不知道!我完全赞成留下“错误”的答案并对其进行注释以解释答案的错误之处。回答了的问题的人可能最终会查看此讨论,即使您的回答对最初的提问者没有帮助,但它可以帮助其他人。如果我是你,我会编辑我的答案以解释为什么它是错误的,并且可能会说一下 SQL Server 链接服务器何时对 Jet/ACE 有用(例如你没有驱动程序可以访问你的 Jet/ACE 的情况数据)。
        猜你喜欢
        • 2013-03-18
        • 1970-01-01
        • 2012-04-25
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 2013-07-15
        相关资源
        最近更新 更多