適切に登録され、sharepoint 2010 環境で動作するタイマー ジョブ ( SPJobDefintion ) を作成しました。
タイマー ジョブのExecuteメソッドでは、特定のSPListItemのフィールドを設定する次のコードを使用できます。これはうまくいきます。
using (SPSite mySite = new SPSite(mySiteId))
{
using (SPWeb myWeb = mySite.OpenWeb(myWebId)))
{
SPList myList= myWeb.Lists[myListId];
SPListItem myItem = myList.GetItemById(myItemId);
myItem["myField"] = myValue;
myItem.Update();
}
}
設計上の理由から、そのコードを別のクラスの別のメソッドに入れたいと思います。そこで、次のクラスを作成しました。
namespace myNamespace
{
class myClass
{
[...some stuff...]
public myClass()
{
[...more stuff...]
}
public void setField()
{
using (SPSite mySite = new SPSite(mySiteId))
{
using (SPWeb myWeb = mySite.OpenWeb(myWebId)))
{
SPList myList = myWeb.Lists[myListId];
SPListItem myItem = myList.GetItemById(myItemId);
myItem["myField"] = myValue;
myItem.Update();
}
}
}
}
}
実際、タイマー ジョブのExecuteメソッドで次のコードを呼び出しても、同じ結果になるはずです。
MyClass myClassInstance = new myClass();
myClassInstance.setField();
残念ながら、次の例外が発生します。
Microsoft.SharePoint.SPException was unhandled by user code
Message=""
Source=Microsoft.SharePoint
ErrorCode=-2147418113
NativeErrorMessage=FAILED hr detected (hr = 0x8000ffff)
NativeStackTrace=""
StackTrace:
bei Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
bei Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, [...])
bei Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, [...])
bei Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, [...])
bei Microsoft.SharePoint.SPListItem.Update()
bei myNamespace.myClass.<>c__DisplayClass1.<setField>b__0()
InnerException: System.Runtime.InteropServices.COMException
Message=<nativehr>0x8000ffff</nativehr><nativestack></nativestack>
Source=""
ErrorCode=-2147418113
StackTrace:
bei Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem(String bstrUrl, [...])
bei Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, [...])
InnerException:
ExecuteメソッドがあるクラスにsetField()メソッドを直接配置すると、メソッドは正常に動作します。このメソッドを静的として宣言すると、同じ例外が発生します。
また、例外が発生したSPListItem.Update()を昇格された特権で実行しようとしました(コードは OWSTIMER コンテキストで実行する必要があるため、理由ではないはずです)。また、SPSite と SPWeb で allowUnsafeUpdates() をいじってみました。どちらも成功しませんでした。
Web で、この問題の説明を 1 つだけ見つけましたhttp://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer (ドイツ語)、残念ながら解決策はありません。
このコンステレーションが機能しない理由として、他に何が考えられるでしょうか? 何か案が?