5

我创建了一个计时器作业(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(德语),不幸的是没有任何解决方案。

还有什么可能是这个星座不起作用的原因?任何想法?

4

1 回答 1

2

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

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

谢谢

森提尔

于 2012-12-13T16:11:06.820 回答