2012-11-24 11 views
5

के उदाहरण में SPListItem.Update() का उपयोग करके मैंने टाइमर जॉब (SPJobDefintion) बनाया है जो उचित रूप से पंजीकृत है और शेयरपॉइंट 2010 वातावरण में काम कर रहा है।SharePoint TimerJob: किसी वर्ग/स्थैतिक विधि

टाइमर नौकरी की निष्पादित विधि में मैं निम्नलिखित कोड है, जो एक विशिष्ट 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(); 
     } 
     } 
    } 
    } 
} 

असल में मैं उम्मीद करेंगे कि में यह निम्न कोड बुला निष्पादित टाइमर नौकरी के विधि एक ही परिणाम में समाप्त होना चाहिए: तो मैं निम्नलिखित वर्ग बनाया।

MyClass myClassInstance = new myClass(); 
myClassInstance.setField(); 

दुर्भाग्य से मैं निम्न अपवाद मिल जाएगा: मैं 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: 

, विधि ठीक से काम करेंगे । अगर मैं इस विधि को स्थैतिक घोषित करता हूं, तो वही अपवाद होगा।

मैं भी (क्योंकि कोड OWSTIMER संदर्भ में चलाया जाना चाहिए, कारण नहीं होना चाहिए) SPListItem.Update(), जहां अपवाद तब होता है, ऊंचा विशेषाधिकारों के साथ भागने की कोशिश की। मैंने एसपीएससाइट और एसपीवेब पर allowUnsafeUpdates() के साथ खेलने की भी कोशिश की। दोनों सफलता के साथ।

वेब में मैं इस समस्या http://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer (जर्मन में) का केवल एक ही वर्णन नहीं मिला, दुर्भाग्य से किसी भी समाधान के बिना।

और क्या कारण हो सकता है कि इस नक्षत्र काम नहीं करेगा? कोई उपाय?

+1

मैंने कुछ गलत अपने कोड के साथ नहीं देख सकते हैं, और वहाँ एक टाइमर काम का मतलब है कि आप एक अलग वर्ग में इस तरह कोड फोन नहीं कर सकते हैं के बारे में कुछ खास नहीं है। मैं अपने कॉल स्टैक को लेकर चिंतित हूं -। आधार विधि 'myNamespace.myClass <> c__DisplayClass1 है। b__0() 'जब, टूर कोड उदाहरण से, मैं यह सिर्फ होने के लिए' myNamespace.myClass.setField उम्मीद चाहते हैं() '। क्या आपको यहां कुछ और जटिल हो रहा है? – Rawling

+0

आपका नमूना कोड गायब लाइनें जहां आप साइट/वेब आईडी पास/सेट करते हैं। सुनिश्चित नहीं है कि यह कोई समस्या है या नहीं, लेकिन नमूने प्रदान करने पर विचार करें जो सभी रोचक हिस्सों को दिखाते हैं ... साइड नोट: नमूने में भी पैरामीटर/सदस्यों के लिए "मेरा" उपसर्ग होने में कोई वास्तविक वाल्यू नहीं है। –

+0

कक्षा को 'सार्वजनिक' नहीं होना चाहिए? इसके अलावा आप टाइमर नौकरियां डीबग कर सकते हैं (owstimer.exe से संलग्न करें) और आपका कोड ताकि अपवाद वास्तव में कहां हो? मुझे लगता है: 'myItem.Update(); '? –

उत्तर

1

यह निश्चित रूप से myWeb.AllowUnsafeUpdates की जरूरत है = true किसी भी सूची आइटम को अद्यतन करने से पहले। इसे अद्यतन करने के बाद इसे वापस गलत पर रीसेट करना न भूलें।

एक बात मुझे यकीन है कि बनाना होगा कोड के रूप में आइटम अद्यतन के लिए पूरे अधिकार चल रहा है यकीन है कि उपयोगकर्ता बनाने के लिए है। मैं सुझाव दूंगा, साइट व्यवस्थापक के रूप में लॉग इन कर रहा हूं और बटन क्लिक ईवेंट (टाइमर जॉब के बजाए) या कुछ अन्य ईवेंट से कोड चलाने का प्रयास करता हूं ताकि यह सुनिश्चित किया जा सके कि यह उपयोगकर्ता अनुमति समस्या नहीं है।

धन्यवाद

सेंथिल एस

+0

AllowUnsafeUpdates से सावधान रहें! आमतौर पर आपको इसका उपयोग करने से बचने की आवश्यकता होती है – devi