以编程方式在访问中创建链接表

时间:2010-03-11 16:20:33

标签: sql-server ms-access

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

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

4 个答案:

答案 0 :(得分:2)

以下是一些注释。

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

答案 1 :(得分:1)

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

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

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

要枚举表格,您有以下选择:

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

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

答案 2 :(得分:0)

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

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

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

编辑:我最初读的问题是字面意思是“ SQL Server 中的链接表 访问”,我将其转换为从SQL到Access的意思。所以,鉴于此,我的解决方案将适用。但是,如果希望从Access访问SQL,那么这是不同的,并且提供的其他解决方案将更合适。

答案 3 :(得分:0)

您可以use ADOX进行实际链接。

就枚举你所连接的数据库中的表而言,你可以做一些简单的事情,就像对你的SQL Server运行这个查询一样简单,但有很多方法可以为那个猫提供皮肤:

SELECT * FROM INFORMATION_SCHEMA.TABLES