2010-11-26 3 views
2

Это странно.Получить значение от SPFieldUser с AllowMultipleValues ​​не удается только в задании таймера

Я выполнения этого кода в таймере Работа в SharePoint 2010 ...

... 
// Get the field by it's internal name 
SPField field = item.Fields.GetFieldByInternalName(fieldInternalName); 

if (field != null) 
{ 
    SPFieldUser userField = (SPFieldUser)field; 
    object value = null; 

    if (userField.AllowMultipleValues) 
    { 
      // Bug when getting field value in a timer job? Throws an ArgumentException 
      users = new SPFieldUserValueCollection(item.ParentList.ParentWeb, item[userField.Id].ToString()); 
    } 
    else 
    { 
      // Get the value from the field, no exception 
      value = item[userField.Id]; 
    } 
} 
... 

Этот код прекрасно работает при запуске в простом ConsoleApplication но при запуске в контексте задания таймера в SharePoint 2010 он бросает ArgumentException в линии ...

users = new SPFieldUserValueCollection(item.ParentList.ParentWeb, item[userField.Id].ToString()); 

Я пробовал много вариантов, чтобы извлечь значение из SPFieldUser, но все не в состоянии только тогда, когда таймер работы выполняет его и поле имеет AllowMultipleValues ​​свойство установлено в значение TRUE ,

Я попытался отладки с отражателем и, кажется, что исключение бросают здесь в SPListItem ...

public object this[Guid fieldId] 
{ 
    get 
    { 
    SPField fld = this.Fields[fieldId]; 
    if (fld == null) 
    { 
     throw new ArgumentException(); 
    } 
    return this.GetValue(fld, -1, false); 
} 
... 

И это здесь будет стек исключение след ...

System.ArgumentException was caught 
Message=Value does not fall within the expected range. 
Source=Microsoft.SharePoint 
StackTrace: 
    at Microsoft.SharePoint.SPFieldMap.GetColumnNumber(String strFieldName, Boolean bThrow) 
    at Microsoft.SharePoint.SPListItemCollection.GetColumnNumber(String groupName, Boolean bThrowException) 
    at Microsoft.SharePoint.SPListItemCollection.GetRawValue(String fieldname, Int32 iIndex, Boolean bThrow) 
    at Microsoft.SharePoint.SPListItem.GetValue(SPField fld, Int32 columnNumber, Boolean bRaw, Boolean bThrowException) 
    at Microsoft.SharePoint.SPListItem.get_Item(Guid fieldId) 
    at FOCAL.Point.Applications.Audits.AuditUtility.GetPeopleFromField(SPListItem item, String fieldInternalName) 

Sighh ... любые мысли?

ответ

1

Это обычно означает, что вы запросили слишком много полей поиска в одном SPQuery, что вызвало бы слишком много самосоединений таблицы true-lookup в базе данных контента, если только SharePoint Foundation не дросселирует ресурсы. Существует пороговая установка, которая составляет 8 поисковых запросов на запрос для обычных пользователей. Убедитесь, что ваш запрос возвращает только необходимые поля поиска или пользователя/группы. Если вы не можете уменьшить использование, подумайте об изменении пороговой настройки.

+0

Привет, Алексей, спасибо за ответ, но прошло уже больше года с этого поста, и я больше не являюсь частью этого проекта. Я бы хотел проверить это, но я боюсь, что не могу. – 2011-12-12 22:47:36

2

Я считаю, что вы можете увеличить пороговое значение вида просмотра списка, как описано here. Но считайте это просто быстрым решением. Возможно, вам нужно настроить свой запрос на данные.

+0

Да, это правильно. +1. – Renan 2013-06-28 20:35:38