Получить значение из SPFieldUser с AllowMultipleValues ​​не удается только в задании таймера - PullRequest
2 голосов
/ 26 ноября 2010

Это странно.

Я выполняю этот код в задании таймера в 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.

Я попытался выполнить отладку с помощью Reflector, и похоже, что здесь вызывается исключение в 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)

Вздох ... есть мысли?

Ответы [ 2 ]

2 голосов
/ 15 июня 2012

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

1 голос
/ 24 ноября 2011

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

...