簡體   English   中英

如何使用C#編輯NSF文件?

[英]How to Edit NSF file using c#?

我想以編程方式將一些值更改為NSF項目,然后保存它。(即,編輯NSF文件,然后保存版本)

例如:

我想將所有郵件的發件人名稱設置為“ preeti@abc.com”。(使用Domino.dll)。

我嘗試的解決方案:(交換To和From值)

字符串Temp_From =((object [])docInbox.GetItemValue(“ From”))[0]作為字符串; 字符串Temp_SendTo =((object [])docInbox.GetItemValue(“ SendTo”))[0]作為字符串; docInbox.ReplaceItemValue(“ From”,Temp_SendTo); docInbox.ReplaceItemValue(“ SendTo”,Temp_From); docInbox.Save(true,false,false);

/ *也適用於以下字段:

對於發件人:AltFrom,DisplayFrom,DisplayFrom_2,dspFrom,ForwardedFrom,INetFrom,tmpDisplayFrom

收件人:displaySendTo,EnterSendTo,Envelope_to,tmpDisplaySendTo

還嘗試保存:docInbox.Save(true,true,true); * /

在上面的代碼中,成功編輯更改后,值未反映在Nsf文件中。 但是當我以編程方式讀取編輯的Nsf文件(將修改后的文件復制到其他位置)時,它顯示的是更改后的值(為什么更改在此處不可見?)

可以在這里找到“編程指南,第2卷:LotusScript / COM / OLE類”: http : //www-12.lotus.com/ldd/doc/uafiles.nsf/docs/DESIGNER70/

不過,作為簡要概述,一旦有了Document的句柄,就可以使用Items屬性遍歷該文檔上的所有現有字段(“項目”)。 並且您可以使用ReplaceItemValue和/或AppendItemValue方法更新該文檔上的給定字段。

您是否正在使用Notes客戶端檢查結果? 我猜這種現象可以由客戶端相當積極的緩存來解釋。 在檢查程序結果之前,請嘗試從數據目錄中刪除文件cache.ndk

另外,Notes“項目”通常包含一個值數組-如果例如已將郵件發送給多個人,則交換SendToFrom字段的方法將丟失數據。 嘗試復制整個object[]

我做了一次。

您必須為項目添加一個新引用,然后在“添加引用”對話框中選擇“ COM”。 在列表中找到名為“ Lotus Domino Objects”的組件並將其添加。 您將在項目中看到一個名為“ Domino”的新引用。 該COM組件由Lotus Notes客戶端安裝。 您必須在開發計算機中安裝它,並且在運行應用程序時也必須安裝它。

從那時起,您可以使用在NotesDesigner中使用Lotusscript開發時可以使用的大多數類。

添加適當的“使用”語句:

using Domino;

創建一個筆記會話:

NotesSession session = new NotesSession();
session.Initialize("mypassword");
//this uses your current Notes location and id.
//i think you can use session.Initialize("") if notes is already running and you are already logged in.

獲取數據庫:

NotesDatabase notesDb = session.GetDatabase("server", "database", false);

獲取一些文檔,例如:今天的約會(如果您打開的數據庫是mail.nsf)

NotesDocumentCollection col = null;
try { col = notesDb.Search("Form = \"Appointment\" & StartDate = @Today", null, 0); }
catch (Exception e) { }

遍歷您的集合:

if (null != col)
{
    NotesDocument doc = col.GetFirstDocument();
    while (doc != null)
    {
        //do your magic tricks
        doc = col.GetNextDocument(doc);
    }
}    

我注意到此接口的一個問題:沒有session.Close()方法或類似的東西,並且一旦GC收集了C#對象,服務器中的會話就沒有關閉。 一旦我打開了一個新的NotesSession(),只要我的c#線程仍在運行,它就會在Domino服務器中保持運行。 為了解決該問題,我不得不創建后台線程,並且僅在線程中實例化新的NotesSession()對象。 在啟動之前,還必須使用STA公寓模式設置線程。

Thread thread = new Thread(new ThreadStart(MyFunctionThatInstantiatesNewNotesSessions));
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
thread.Join();

我不確定這個問題是否真的是界面中的問題,或者我在代碼中做錯了其他事情。 但是,如果有人遇到了這個問題:線程是我解決問題的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM