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

时间:2014-10-30 11:21:00

标签: vba sharepoint connection-string recordset

我可以通过这种方式使用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放在连接字符串上的语法。我该怎么办?

2 个答案:

答案 0 :(得分:0)

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

  

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

我不知道您的环境,但对我来说,最简单的方法是创建指向SharePoint列表的2个链接表,然后您可以按照自己的方式操作数据。

答案 1 :(得分:0)

我知道这是一个较老的问题,但我试图尝试同样的努力,当我在寻找例子时,我通常会看到相同的答案"不可能"。

正如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

End Sub