繁体   English   中英

从 Excel 执行 sql 以访问 Sharepoint 列表中的链接表

[英]Execute sql from Excel to Access with linked tables from Sharepoint lists

我有一个 Excel 文件,它在带有本地表的 MS Access 数据库上执行 SQL 查询,工作正常。 现在我必须让这个数据库在网络上工作,我们只有 SharePoint。 我发现了 SharePoint 列表,因此我将表导出到这些列表中,现在我有了一个带有链接表的 Access 数据库。

问题是我无法像以前那样在这个数据库上使用来自 Excel 的查询。 可能吗? 因为我可以从 Access 进行这些查询并且它可以工作,所以我不明白为什么它不能来自 Excel。 这是我的 function:

Sub test()
    Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String

    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                    "Data Source=" & "C:\...\BADO.accdb"

    strSql = "SELECT Count(*) FROM Programmes;"
    cn.Open strConnection

    Set rs = cn.Execute(strSql)
    MsgBox rs.Fields(0) & " tuples dans Programmes"

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

连接cn.Open的部分工作,但是当它尝试执行cn.Execute时,Excel 进入无休止的加载并崩溃。 此代码仅适用于本地表。

如果不可能,我想我可以让数据库及其本地表在 SharePoint 上并让用户将其与 OneDrive 同步,但我不知道同步是如何工作的。 如果数据库很重,我不希望他们每次都上传完整大小。 那么,有没有办法让这段代码工作呢?

归根结底,这是一个网络环境问题。 从 Excel 测试您的代码,其中工作簿和 Access 数据库都驻留在通过局域网 (LAN) 连接到 SharePoint 的网络上,我没有遇到挂起或崩溃的问题。

但是,从通过无线或远程连接连接到 SharePoint 的本地 CPU 运行工作簿和 Access 数据库时,我确实遇到了严重的挂起和崩溃。

因此,请按复杂程度考虑以下选项:

  1. LAN 连接:将 Excel 工作簿和 Access 数据库放置在与 SharePoint 建立 LAN 连接的网络空间上。 这可能涉及用户通过 VPN 远程连接到本地计算机。

  2. 操作查询:让 MS Access 从链接到您的简单计数聚合的本地表运行生成表查询:

     SELECT Count(*) AS [Count] INTO Programmes_Count FROM Programmes;

    或者,对预先创建的表使用 append 查询可能比DROP TABLE更好,并且每次都重新创建:

     DELETE FROM Programmes_Count; INSERT INTO Programmes_Count ([Count]) SELECT Count(*) FROM Programmes;

    此类操作查询可以保存,然后使用从 Excel 调用的Access 宏模块自动执行。 然后让 Excel 访问这些本地表。

  3. COM 自动化:让 Excel 启动 Access。应用程序作为COM ZA8CFDE6331BD59EB2AC96F8911C46 然后查询链接表。666F8911C46

     Sub RunQuery() Dim accApp, db, qdef, rst As Object Dim strSQL As String Set accApp = CreateObject("Access.Application") ' LAUNCH ACCESS IN BACKGROUND accApp.OpenCurrentDatabase "C:\Path\To\Database.accdb" strSQL = "SELECT Count(*) AS [Count] FROM Programmes;" Set db = accApp.CurrentDb() ' ASSIGN UNDERLYING DB Set qdef = db.CreateQueryDef("", strSQL) ' CREATE QDEF OR USE SAVED Set rst = qdef.OpenRecordset() ' OPEN RECORDSET ' LAUNCH MESSAGE BOX MsgBox rst.Fields(0) & " tuples dans Programmes" ' CLOSE OBJECTS rst.Close: qdef.Close accApp.DoCmd.CloseDatabase accApp.Quit ' RELEASE RESOURCES Set rst = Nothing: Set qdef = Nothing: Set db = Nothing: Set accApp = Nothing End Sub

    甚至更好地绕过 Access 应用程序并通过 DAO 查询 Access:

     Sub RunQuery() Dim conn, db, qdef, rst As Object Dim strSQL As String Set conn = CreateObject("DAO.DBEngine.120") ' LAUNCH DAO CONNECTION Set db = conn.OpenDatabase("C:\Path\To\Database.accdb") strSQL = "SELECT Count(*) AS [Count] FROM Programmes;" Set qdef = db.CreateQueryDef("", strSQL) ' CREATE QDEF OR USE SAVED Set rst = qdef.OpenRecordset() ' OPEN RECORDSET ' LAUNCH MESSAGE BOX MsgBox rst.Fields(0) & " tuples dans Programmes" ' CLOSE OBJECTS rst.Close: db.Close ' RELEASE RESOURCES Set rst = Nothing: Set qdef = Nothing Set db = Nothing: Set conn = Nothing End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM