使用 ADODB 连接到两个(或更多)共享点列表

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

我可以通过这种方式使用 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
3个回答
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

结束子


0
投票

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

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

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


0
投票

我发现实现此目的的最佳方法是使用 vb 将表格导入到 Excel 中的单独工作表中。然后将工作表数据拉入 Power Query...在 PQ 中加入和操作。它比使用 vb 连接上面列出的单独表并循环遍历每个记录集要快得多。如果您使用 Power query 直接从 Sharpoint 而不是 vb 获取数据,似乎 PQ 中的每个源实际上都会提取所有表,然后保留您想要的表 - 而且它对每个源表都执行此操作 - 太慢了。

© www.soinside.com 2019 - 2024. All rights reserved.