使用OWSSVR.dll

时间:2016-10-26 18:55:50

标签: sharepoint ssis multi-select url-protocol

我正在创建一个大规模的SSIS项目,将数据从一系列Sharepoint列表移动到新的Dynamics CRM实施(在线)。 SSIS包使用OData Source从列表中提取数据。

我的列表中有两列未显示在OData调用上。这两列具有Multi-Select或Multi-Lookup值。 REST服务不支持多选选择字段。 (在另一个线程上找到:您尝试的方法仅适用于非多选的选择列。不幸的是,REST接口不支持多选选择列。显然,SharePoint 2013也是如此。)

因此,我需要尝试使用OWSSVR.dll访问SharePoint列表中这些列中的数据。我遇到问题的列表给出了“无法显示此页面”或“根据我使用的浏览器无法访问此站点”。

我通过从列表设置中抓取它来验证列表ID。由于它不起作用,我转到我已迁移的另一个SharePoint列表以验证URL格式。另一个列表工作并以XML格式返回数据。

我想知道OWSSVR.dll是否对多选值有相同的限制。有什么想法或建议吗?

Psuedo URLS(限制访问网站):

作品:http://dummy.sharepointSite.Com/cases/_vti_bin/owssvr.dll?Cmd=Display&List= {b703d405-48c8-4211-9137-e1b50bdb0330}& XMLDATA = TRUE

破碎:http://dummy.sharepointSite.Com/cases/_vti_bin/owssvr.dll?Cmd=Display&List= {8e148584-b5be-48f5-9343-85d23a7731cc}& XMLDATA = TRUE

1 个答案:

答案 0 :(得分:0)

我想出了一种不使用OWSSVR就可以做到这一点的方法。我必须将用户上下文设置为SharePoint站点,然后检索项目列表。

方法:

public static ClientContext SetupSPContext(string documentLibrarySiteURL, 
                        string userName, string password, string domain = "")
{
    ClientContext clientContext = new ClientContext(documentLibrarySiteURL);
    SecureString pwString = new SecureString();

    foreach (char c in password.ToCharArray()) { pwString.AppendChar(c); }
    if (!String.IsNullOrWhiteSpace(domain))
        clientContext.Credentials = new NetworkCredential(userName, pwString, domain);
    else
        clientContext.Credentials = new SharePointOnlineCredentials(userName, pwString);

    Web web = clientContext.Web;
    clientContext.Load(web);
    clientContext.ExecuteQuery();
    return clientContext;
}

public static ListItemCollection GetListItems(ClientContext context, string listName)
{
    ListCollection listCollection = context.Web.Lists;
    List targetList = context.Web.Lists.GetByTitle(listName);

    CamlQuery query = new CamlQuery();
    query.ViewXml = "<Query><OrderBy><FieldRef Name='fieldName' /></OrderBy></Query>";
    ListItemCollection collListItem = targetList.GetItems(query);

    context.Load(collListItem);
    context.ExecuteQuery();

    if (collListItem.Count == 0)
    {
        return null;
    }
    else
    {
        return collListItem;
    }
}

SSIS脚本组件中的代码:

//In the PreExecute method: 
//  Variables were defined for the class and not in the preExecute Method
ClientContext spContext = SetupSPContext(Variables.spLocation, Variables.spUserName, 
                                Variables.spPassword, Variables.spDomain);
ListItemCollection listItems = GetListItems(spContext, "List Name");

//Inside the Individual loop inside SSIS (Input0_ProcessInputRow):
ListItem listItem = GetListItem(listItems, fieldValue);

//Multiple Lookup Code
var values = (FieldLookupValue[])listItem["fieldName"];
var finalValue = "FieldName values:  ";

if (values.Length > 0)
{ 
    foreach (var value in values)
    {
        finalValue = value.LookupValue + "; ";
    }
}

//Multiple Select
if (listItem["fieldName2"] != null)
{
    var valuesTwo = (string[])listItem["fieldName2"];
    string combinedValues = "fieldName2 Values:  ";

    foreach (var value in valuesTwo)
    {
        combinedValues += value + "; ";
    }
}