SharePoint计时器作业:在类/静态方法的实例中使用SPListItem.Update()

时间:2012-11-24 22:25:54

标签: c# sharepoint sharepoint-2010 timer timer-jobs

我创建了一个计时器作业( SPJobDefintion ),该作业已正确注册并在sharepoint 2010环境中工作。

在Timer Job的 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: 

当我将 setField()方法直接放在 Execute 方法所在的类中时,该方法将正常工作。如果我将此方法声明为静态,则会发生相同的异常。

我还尝试使用提升的权限运行发生异常的 SPListItem.Update()(应该不是原因,因为代码应该在OWSTIMER上下文中运行)。我还尝试在SPSite和SPWeb上使用allowUnsafeUpdates()。两者都没有成功。

在网络上,我发现这个问题只有一个描述http://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer(德语),遗憾的是没有任何解决方案。

还有什么可能是因为这个星座不起作用?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

肯定需要myWeb.AllowUnsafeUpdates = true;在更新任何列表项之前。不要忘记在更新后将其重置为false。

我要确保的一件事是确保代码正在运行的用户具有更新项目的完全权限。我建议,以站点管理员身​​份登录并尝试从按钮单击事件(而不是计时器作业)或其他事件运行代码,以确保它不是用户权限问题。

由于

Senthil S