2010-11-26 4 views
2

Dieser ist seltsam.Wert von SPFieldUser mit AllowMultipleValues ​​erhalten, schlägt nur in einem Timer-Job fehl

ich diesen Code in einem Timer Job bin Ausführung in 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]; 
    } 
} 
... 

Dieser Code funktioniert perfekt, wenn in einem einfachen Consoleapplication laufen, aber wenn sie im Rahmen eines Timer Jobs in Sharepoint 2010 lief es wirft ein Argument in der Linie ...

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

ich viele Variationen versucht habe, einen Wert aus einer SPFieldUser retreive aber alle nicht nur, wenn ein Timer Job es ausgeführt wird und das Feld hat AllowMultipleValues ​​Eigenschaft auf TRUE gesetzt .

ich das Debuggen mit Reflektor versucht haben, und es scheint, dass die Ausnahme in SPListItem hier geworfen wird ...

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

Und das hier würde die Ausnahme-Stack-Trace sein ...

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 ... irgendwelche Gedanken?

Antwort

1

Dies bedeutet im Allgemeinen, dass Sie zu viele Nachschlagefelder in einer einzelnen SPQuery angefordert haben, die zu viele Self-Joins der True-Lookup-Tabelle in der Inhaltsdatenbank verursachen würden, sofern SharePoint Foundation die Ressourcen nicht gedrosselt hat. Es gibt eine Schwellenwerteinstellung, die für normale Benutzer bei 8 Suchvorgängen pro Abfrage besteht. Stellen Sie sicher, dass Ihre Abfrage nur die erforderlichen Nachschlage- oder Personen-/Gruppenfelder zurückgibt. Wenn Sie die Verwendung nicht verringern können, sollten Sie die Schwellenwerteinstellung ändern.

+0

Hey @Alexey, danke für die Antwort, aber es ist nun seit über einem Jahr seit diesem Post und ich bin nicht mehr ein Teil dieses Projekts. Ich würde das gerne bestätigen, aber ich fürchte, ich kann das nicht. –

2

Ich glaube, Sie können die List View Lookup Threshold erhöhen, wie es here beschrieben wird. Aber halte es nur für eine schnelle Lösung. Wahrscheinlich müssen Sie Ihre Abfrage nach Daten optimieren.

+0

Ja, das ist richtig. +1. – Renan

Verwandte Themen