我正在创建一个大规模的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
答案 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 + "; ";
}
}