2010-11-26 3 views
2

これは異常です。AllowMultipleValuesでSPFieldUserから値を取得するのは、タイマージョブでのみ失敗します

私はこのコードは、簡単なConsoleApplicationで実行したときに完璧に動作しますが、SharePoint 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]; 
    } 
} 
... 

をこのコードを実行していますそれは私がSPFieldUserから値を盗んために多くのバリエーションを試してみた

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

ラインでArgumentExceptionがする...スローが、すべてはタイマージョブが実行されている場合にのみ失敗し、フィールドが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で必要な検索フィールドが多すぎるため、SharePoint Foundationがリソースを調整しない限り、コンテンツルックアップテーブルの自己参照結合が多すぎることを意味します。一般ユーザーのクエリごとに8回の検索が行われるしきい値設定があります。照会で必要なルックアップまたは個人/グループのフィールドのみが返されるようにしてください。使用量を減らすことができない場合は、しきい値設定を変更することを検討してください。

+0

Hey @Alexey、返信ありがとうございますが、この投稿から1年以上経ちましたが、私はもはやこのプロジェクトの一部ではありません。私はこれを確認したいが、私はできないのではないかと恐れている。 –

2

リストビューのルックアップしきい値をどのように記述するかは、hereに増やすことができます。しかし、それを単なる速い修正と見なしてください。おそらく、データのクエリを調整する必要があります。

+0

はい、これは正しいです。 +1。 – Renan

関連する問題