2012-11-24 23 views
5

Tôi đã tạo công việc hẹn giờ (SPJobDefintion) được đăng ký và làm việc đúng cách trong môi trường SharePoint 2010.SharePoint TimerJob: Sử dụng SPListItem.Update() trong trường hợp của lớp/phương thức tĩnh

Trong phương pháp Execute của Timer Job Tôi có thể sử dụng đoạn mã sau, mà lập một lĩnh vực cụ thể một SPListItem. Điều này hoạt động tốt.

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(); 
    } 
} 

Vì lý do thiết kế, tôi muốn đặt mã đó theo phương pháp riêng biệt của một lớp riêng biệt. Vì vậy, tôi đã tạo ra lớp sau:

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(); 
     } 
     } 
    } 
    } 
} 

Thật sự tôi hy vọng rằng gọi đoạn mã sau này trong Execute phương pháp của công việc hẹn giờ nên kết thúc ở cùng một kết quả.

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

Đáng tiếc là tôi sẽ nhận được ngoại lệ sau đây:

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: 

Khi tôi đặt setField() phương pháp trực tiếp trong lớp nơi Execute phương pháp là, phương pháp này sẽ làm việc đúng cách . Nếu tôi khai báo phương thức này là static, cùng một ngoại lệ sẽ xảy ra.

Tôi cũng đã cố gắng chạy SPListItem.Update(), trong đó ngoại lệ xảy ra, với đặc quyền nâng cao (không phải là lý do, vì mã phải chạy trong ngữ cảnh CHỦ SỞ HỮU). Tôi cũng đã cố gắng để chơi xung quanh với allowUnsafeUpdates() trên SPSite và SPWeb. Cả hai đều không thành công.

Trong trang web tôi chỉ tìm thấy một mô tả về sự cố này http://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer (bằng tiếng Đức), rất tiếc, không có giải pháp nào.

Điều gì khác có thể là lý do, chòm sao này sẽ không hoạt động? Bất kỳ ý tưởng?

+1

Tôi không thể nhìn thấy bất cứ điều gì sai trái với mã của bạn, và không có gì đặc biệt về một công việc hẹn giờ có nghĩa là bạn không thể gọi mã như thế này trong một lớp học khác nhau là. Tôi quan tâm đến ngăn xếp cuộc gọi của bạn - phương thức cơ bản là 'myNamespace.myClass. <> C__DisplayClass1. b__0() 'khi nào, từ ví dụ về mã tham quan, tôi đã mong đợi nó chỉ là' myNamespace.myClass.setField() '. Bạn có bất cứ điều gì phức tạp hơn đang xảy ra ở đây không? – Rawling

+0

Mã mẫu của bạn thiếu các dòng nơi bạn chuyển/đặt trang web/ID web. Không chắc chắn nếu nó là một vấn đề hay không nhưng xem xét việc cung cấp mẫu cho thấy tất cả các phần thú vị ... Lưu ý bên: không có tiền thực trong việc có tiền tố "của tôi" cho các tham số/thành viên, ngay cả trong các mẫu. –

+0

Lớp học có nên là 'công khai' không? Ngoài ra, bạn có thể gỡ lỗi công việc hẹn giờ (đính kèm vào owstimer.exe) và mã của bạn để chính xác nơi nào ngoại lệ xảy ra? Tôi đoán ở đây: 'myItem.Update();'? –

Trả lời

1

Chắc chắn cần myWeb.AllowUnsafeUpdates = true; trước khi cập nhật bất kỳ mục danh sách nào. đừng quên thiết lập lại nó thành false sau khi cập nhật nó.

Một điều tôi sẽ đảm bảo là đảm bảo người dùng đang chạy mã có toàn quyền cập nhật mục. Tôi khuyên bạn nên đăng nhập với tư cách quản trị viên trang web và thử chạy mã từ sự kiện nhấp nút (thay vì công việc hẹn giờ) hoặc một số sự kiện khác chỉ để đảm bảo rằng đó không phải là vấn đề về quyền của người dùng.

Cảm ơn

Senthil S

+0

hãy cẩn thận với AllowUnsafeUpdates! thông thường bạn cần tránh sử dụng nó – devi

Các vấn đề liên quan