【问题标题】:Multi-Select fields on a Sharepoint list using OWSSVR.dll使用 OWSSVR.dll 在 Sharepoint 列表中多选字段
【发布时间】:2017-03-09 06:46:09
【问题描述】:

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

我的列表中有两列未显示在 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

【问题讨论】:

    标签: sharepoint ssis multi-select url-protocol


    【解决方案1】:

    我想出了一种不使用 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 + "; ";
        }
    }
    

    【讨论】:

    • 事后看来,我可以使用来自 OData 源的输入的脚本组件将其更改为直接从 SharePoint 列表中提取所有信息。但是,我已经为包完成了所有其他逻辑,并且不想处理将所有现有调用转换为检查来自 SharePoint 的值的问题。这是用于 DataMigration 的一次性运行 SSIS 包。我不是在寻找完美的模型。我只需要迁移所有数据。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2014-01-06
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多