2

これは奇妙です。

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)

はあ…何か考えはありますか?

4

1 に答える 1

1

これは通常、SharePoint Foundation がリソースを調整しない限り、1 つの SPQuery で要求したルックアップ フィールドが多すぎて、コンテンツ データベース内の真のルックアップ テーブルの自己結合が多すぎることを意味します。一般ユーザーの場合、クエリごとに 8 回のルックアップというしきい値設定があります。クエリが必要なルックアップまたは個人/グループ フィールドのみを返すことを確認してください。使用量を減らすことができない場合は、しきい値の設定を変更することを検討してください。

于 2011-11-24T12:01:44.210 に答える