Multi-Select поля в списке Sharepoint, используя OWSSVR.dll
Я нахожусь в процессе создания масштабного проекта SSIS для перемещения данных из серии списков Sharepoint в новую реализацию Dynamics CRM (онлайн). Пакет служб SSIS использует источник данных OData для извлечения данных из списков.
В моем списке есть два столбца, которые не отображаются в вызове OData. Эти два столбца имеют значения Multi-Select или Multi-Lookup. Службы REST не поддерживают поля множественного выбора. (Найдено в другом потоке. Методы, которые вы пытаетесь использовать, работают только со столбцами выбора, которые НЕ являются множественным выбором. К сожалению, столбцы множественного выбора не поддерживаются интерфейсом REST. То же самое относится и к SharePoint 2013, очевидно.)
Поэтому мне нужно попытаться получить доступ к данным в этих столбцах в списке SharePoint с помощью OWSSVR.dll. Список, с которым у меня возникают проблемы, дает мне "Эта страница не может быть отображена" или "Этот сайт не доступен" в зависимости от используемого браузера.
Я проверил идентификатор списка, выбрав его из настроек списка. Поскольку это не сработало, я перешел к другому списку 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 ответ
Я нашел способ сделать это без использования 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 + "; ";
}
}