ListItem-Update führt zu „Catastrophic failure“

In einer SharePoint Liste ohne EventReceiver mit einem nicht angepassten Standardformular meldet das System beim Versuch ein Listenelement zu aktualisieren Folgendes:

Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

Neben der doch sehr drastischen Wortwahl deutet bereits das HRESULT auf eine durchgereichte COM-Exeption hin. Gerade bei solch vermeintlich tiefgreifenden Offenbarungen erhält man üblicherweise den bekannten, ganzseitigen Dialog mit der beschwichtigenden Entschuldigung, etwas hätte leider nicht geklappt. Nicht so hier. Die Meldung erscheint ohne viel Drumherum und ohne Korrelationsid in roten Lettern direkt unterhalb der Angaben zu Erstellt/Geändert und dem Speichern-Button.
Das Anlegen von Listenelementen in besagter Liste funktioniert weiterhin problemlos – nur unangenehmerweise das Update nicht mehr.

Ein Blick ins ULS (Methodensignaturen auf das Wesentliche gekürzt) gibt ein wenig mehr Informationen preis:

Original error: Microsoft.SharePoint.SPException: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) 
---> System.Runtime.InteropServices.COMException: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))    
 at Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem( /* --- snip --- */ )    
 at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem( /* --- snip --- */ )     -
-- End of inner exception stack trace ---    
 at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)    
 at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem( /* --- snip --- */ )    
 at Microsoft.SharePoint.SPListItem.AddOrUpdateItem( /* --- snip --- */ )    
 at Microsoft.SharePoint.SPListItem.UpdateInternal( /* --- snip --- */ )    
 at Microsoft.SharePoint.SPListItem.Update()    
 at Microsoft.SharePoint.SPListItem.ValidateUpdateListItem_Client( /* --- snip --- */ )    
 at Microsoft.SharePoint.ServerStub.SPListItemServerStub.InvokeMethod( /* --- snip --- */ )    
 at Microsoft.SharePoint.Client.ServerStub.InvokeMethodWithMonitoredScope( /* --- snip --- */ )

Hier erfährt man, wo die Exception geworfen wurde. Leider führt auch mit diesen detaillierteren Angaben eine Suche im Netz schnell in die Irre, was mir Grund und Anlass für diesen kurzen Post sein soll.
Gut gemeinte Tipps wie „iisreset“ oder „Liste löschen und neu anlegen“ über „Entfernen von Inhaltstypen lowlevel in der Config-DB“ bis hin zu „ein ernstzunehmendes Problem mit möglicherweise korrupten DLLs und man möge den 0x8000FFFF bitte nicht auf die leichte Schulter nehmen“ waren dabei nicht ernsthaft vielversprechend. Lediglich ein Hinweis auf einen Schreibfehler einer Feldbezeichnung in der Schema.xml hatte Potential.

Was ich noch erwähnen sollte: Die Liste ist Teil einer per WSP im SharePoint ausgerollten Solution mit deklarativ definierten Listen.

Die Lösung

Da es recht sicher war, dass der Fehler im Zusammenhang mit der Listendefinition stehen musste, schien die Eingrenzung des Fehlers sinnvoll. Durch das Löschen aller benutzerdefinierten Felder der Liste, bis ein Update wieder möglich war, konnte als Übeltäter ein Auswahlfeld (Choice-Field) identifiziert werden. Mit einem von Hand auf der Liste angelegten Feld gleichen Namens und Typs bestand das Problem nicht länger.

Die genaue Untersuchung der Feld-Definition in der Schema.xml der zugrundeliegenden Liste brachte die Ursache ans Licht.
Im Field-Element des Auswahlfelds war das optionale Attribut BaseType mit dem Wert  „Integer“ enthalten, mit welchem man explizit angeben kann, ob der Wert als Integer oder als Text persistiert werden soll.

In der Beschreibung des Attributs im Artikel der MSDN ist ersichtlich, dass die Verwendung des BaseTypes in Zusammenhang mit Choice- bzw. Auswahlfeldern nicht möglich ist:

BaseType | Optional. The BaseType attribute can be set to Integer, which stores values as integers, or to Text (default), which stores values as text. You cannot create integer base-type choice fields.

Dennoch spannend, dass sich ein dementsprechend definiertes Feld in einer Liste überhaupt anlegen und ein Listenelement damit erstellen lässt sowie dass dazu noch die eher spektakuläre, wenig sagende Fehlermeldung präsentiert wird.
Falls irgendjemand mal Lust hat herauszubekommen, warum ausgerechnet für Auswahlfelder die Option Integer nicht zulässig ist – ich würde mich über eine Antwort freuen.

Über Thomas Roschinsky
Software Engineer | .NET | SharePoint | Dynamics CRM | BI | C# | C/C++

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: