【问题标题】:Connection to two (or more) sharepoint lists with ADODB使用 ADODB 连接到两个(或更多)共享点列表
【发布时间】:2014-10-30 11:21:00
【问题描述】:

我可以通过这种方式使用 ADODB 连接到 SharePoint 列表:

Dim objCon As New ADODB.Connection
objCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=mysite/documents;LIST={xxxx-guid-xxxx};"

Dim rst As Recordset
Set rst = objCon.Execute("Select * from list1)

它正在工作:)。

现在,我想同时连接两个列表进行内部连接:

Set rst = objCon.Execute("Select * from list1 inner join list2)

但我没有找到将第二个列表 GUID 放在连接字符串上的语法。我该怎么办?

【问题讨论】:

    标签: vba sharepoint connection-string recordset


    【解决方案1】:

    我知道这是一个较老的问题,但不久前我试图尝试同样的努力,当我寻找示例时,我通常看到相同的答案“不,它不可能”。

    正如 Thomas G 所指出的,它可以作为“断开连接的记录集”(我通常将它们称为子查询),然后将两个列表连接在一起。

    我的目标是避免首先将数据导入 Excel 以运行加入列表的查询,因为我实际上使用它每周将多个文件批量导入 SharePoint 中的多个列表。如果我能避免的话,我只是不想在 Excel 中处理数据维护/清理。 (这几个文件在导入过程中都使用了来自两个不同列表的数据)

    根据最初的问题,我简化了代码以仅检索针对两个 SharePoint 列表的 Select 查询的结果。该代码是为 Excel VBA 编写的,但如果删除了 Excel 部分,则可以在任何 VBA 实例中使用。

    Sub SQL_Two_SP_Lists()
    
    
    Dim sp_sdbPath As String, sp_sConnect As String
    Dim SP_List_1 As String, SP_List_2 As String
    Dim c As Long
    
    
    Dim cnSP As New ADODB.Connection
    Dim rsSP As New ADODB.Recordset
    
    
    sp_sdbPath = "https://your_SharePoint_URL_Here/"
    sp_sConnect = "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=" & sp_sdbPath & ";"
    
    
    SP_List_1 = "LIST={List 1 GUID Here}" 'i.e. xxxx-guid-xxxx
    SP_List_2 = "LIST={List 2 GUID Here}" 'Go to List settings > Information Management Policy Settings > GUID is in the URL
    
    
    'Establish a connection to the first List
    cnSP = sp_sConnect + SP_List_1
    cnSP.Open
    
    
    'Write the SQL & Establish a connection to the second List as a sub-query using IN
    sSQL = "SELECT A.*, B.* " + _
           "FROM List A " + _
           "INNER JOIN (Select * From LIST IN 'DATABASE=" & sp_sdbPath & ";" & SP_List_2 & "' 'WSS;RetrieveIds=Yes;') B On A.Cust_ID  = B.Cust_ID;"
    
    rsSP.Open sSQL, cnSP, adOpenStatic, adLockReadOnly 'Change cursor & lock type if inserting, updating or deleting
    
    
    'The rest is to drop the results into an empty worksheet named 'Test'
    For c = 0 To rsSP.Fields.Count - 1    
        ThisWorkbook.Sheets("Test").Cells(1, c + 1) = rsSP.Fields(c).Name    
    Next
    
    ThisWorkbook.Sheets("Test").Cells(2, 1).CopyFromRecordset rsSP
    
    
    rsSP.Close
    cnSP.Close
    

    结束子

    【讨论】:

    • 谢谢你这样做,这对我有用:)
    【解决方案2】:

    来自微软http://msdn.microsoft.com/en-us/library/ee633650.aspx

    不支持从多个列表中选择字段。您可以为每个列表创建一个数据集并从每个数据集中选择字段。

    我不了解您的环境,但对我而言,完成此任务的最简单方法是创建 2 个指向您的 SharePoint 列表的链接表,然后您可以按照您想要的方式操作它们的数据。

    【讨论】:

    • 我的环境是一个包含许多列表的 SharePoint 网站,我想从 Excel 中查询值以创建具有值的图形。我确定如果我使用 for 循环进行内部连接,这将非常慢:(
    • 好吧,我以为是 Access 的。所以忘记了链接表。因此,您应该打开 2 个不同的记录集并循环遍历它们。如果它很慢,请尝试首先将每个记录集导入单独的 Excel 工作表(在批量模式下应该很快)并循环工作表的值。这就是我会采取的方法
    • 感谢您的回答,是否可以像对待表格一样对待工作表并使用 SQL 在两者之间进行查询?
    • 是的,您可以通过将其包含加载到记录集中(在这种情况下称为“断开连接的记录集”)来处理表格。不,至少据我所知,不可能在 2 个不同的记录集之间进行连接。
    • 谢谢,我已经按照您的建议完成了,批量复制工作表,并在工作表之间进行连接。最好的问候
    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多