5

適切に登録され、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 (ドイツ語)、残念ながら解決策はありません。

このコンステレーションが機能しない理由として、他に何が考えられるでしょうか? 何か案が?

4

1 に答える 1

2

間違いなく myWeb.AllowUnsafeUpdates = true; が必要です。リスト項目を更新する前。更新後は忘れずに false にリセットしてください。

私が確認することの 1 つは、コードを実行しているユーザーが項目を更新する完全な権限を持っていることを確認することです。サイト管理者としてログインし、ボタン クリック イベント (タイマー ジョブではなく) またはその他のイベントからコードを実行して、ユーザー権限の問題ではないことを確認することをお勧めします。

ありがとう

センティルS

于 2012-12-13T16:11:06.820 に答える