0

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

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

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

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

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

伪 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

4

1 回答 1

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 + "; ";
    }
}
于 2016-11-29T20:44:51.217 回答