2013-02-25 62 views
4

我試圖將附件添加到我剛剛在使用CAML的Sharepoint服務器上創建的列表項。下面的代碼被簡化了(例如路徑通常是一個變量,而第二個字段(這裏的項目id,這裏是16847)通常是我從CAML的insert語句中得到的id)。Lists.AddAttachment拋出對象引用錯誤

這是我的代碼:

String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
String savePath = desktopPath + @"\" + "tutorials.txt"; 
byte[] data = GetData(savePath); 
lists.AddAttachment("Tasks", "16847", "tutorials.txt", data); 

我得到這個錯誤:

無法根據您的更改更新安全。 ItemUpdating期間發生以下異常:對象引用未設置爲對象的實例。 有關更多信息,請參閱事件查看器。0x81020089

getdata是一種將桌面上的文件轉換爲byte []的方法。數據不是空的,它看起來沒問題。

除此之外,Tasks是需要的列表,16847是添加附件的任務ID。

我能找到的大部分信息都是關於不同的錯誤:索引超出範圍異常(如在msdn頁面上:http://msdn.microsoft.com/en-us/library/lists.lists.addattachment(v=office.12).aspx)。

我也嘗試了一個http放(明顯未經授權的訪問)和複製服務(如果我們找不到上述更簡單的方法的解決方案,我可以發佈此代碼)。

誰能告訴我什麼是錯的?

編輯1:

private dcp.Lists lists = new dcp.Lists(); 
lists.Credentials = System.Net.CredentialCache.DefaultCredentials; 
lists.Url = Values.SERVERADDRESS + "/_vti_bin/lists.asmx"; 

這初始化爲我們的Web服務的連接。它的工作原理更新完全正常,插入...

的GetData代碼:

private byte[] GetData(String savePath) 
    { 
     byte[] contents; 
     using (FileStream fStream = File.OpenRead(savePath)) 
     { 
      contents = new byte[fStream.Length]; 
      sFileName = fStream.Name; 
      fStream.Read(contents, 0, Convert.ToInt32(fStream.Length)); 
     } 
     return contents; 
    } 

編輯2:

注意以下不工作(我得到現有的附件的正確的列表從任務):

XmlNode ndAttach = lists.GetAttachmentCollection("Tasks", "16847"); 

MessageBox.Show(ndAttach.OuterXml); 

和下面不(相同的錯誤作爲AddAttachment法):

lists.DeleteAttachment("Tasks", "16847", ndAttach.ChildNodes[0].InnerText); 

雖然我很肯定這應該工作,因爲它不完全一樣,MSDN上的示例代碼:以上http://msdn.microsoft.com/en-us/library/lists.lists.deleteattachment(v=office.12).aspx

+0

什麼是初始化列表? GetData是做什麼的?例外是否給出了行號? – 2013-02-25 14:43:30

+0

和你的'GetData'方法中的* code *?請注意,您應該將這些信息編輯到您的問題中,而不是將其添加到評論中。 – 2013-02-25 14:53:41

+0

好的謝謝,這是我的第一篇文章 – 2013-02-25 14:58:44

回答

2

的代碼是好的,我們的服務器上發生的錯誤。添加附件時,xml中沒有給出contenttype。這被編程爲拋出一個錯誤,因爲我們一直使用這種方法來更新和添加新項目。所以我們從底層代碼中刪除了內容類型,它的功能就像一個魅力。

相關問題