通过Sharepoint列表中的链接表从Excel到Access执行sql。

问题描述 投票:0回答:1

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

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

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同步,但我不知道如何同步工作。如果数据库很重,我不希望他们每次都要上传完整的大小。那么,有没有办法让这段代码工作呢?

sql excel ms-access sharepoint ado
1个回答
0
投票

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

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

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

  1. 局域网连接: 将Excel工作簿和Access数据库置于与SharePoint建立局域网连接的网络空间。这可能需要用户通过VPN远程连接到内部的计算机。

  2. 行动查询: 让MS Access从链接到你的简单计数汇总的本地表上运行制作表查询。

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

    或者,在事先创建的表上使用追加查询,这可能比在网上查询更好。DROP TABLE 并每次重新创建。

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

    这样的动作查询可以被保存下来,然后通过以下方式自动完成 访问宏模块 从Excel中调用。然后让Excel访问这些本地表格。

  3. COM自动化: 让Excel启动 Access.Application 作为一个COM对象,然后让数据库本身查询链接表。

    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
    
© www.soinside.com 2019 - 2024. All rights reserved.