如何使用c#编辑NSF文件?

时间:2009-11-11 09:28:35

标签: c# lotus-notes interop-domino

我想programaticaly将一些值更改为NSF项目,然后想要保存它。(即编辑NSF文件然后保存版本)

例如:

我想将所有邮件的发件人名称设置为“preeti@abc.com”。(使用Domino.dll)。

解决方案我尝试过:(交换To和From值)

String Temp_From =((object [])docInbox.GetItemValue(“From”))[0] as String; String Temp_SendTo =((object [])docInbox.GetItemValue(“SendTo”))[0] as String; docInbox.ReplaceItemValue(“From”,Temp_SendTo); docInbox.ReplaceItemValue(“SendTo”,Temp_From); docInbox.Save(true,false,false);

/ *也适用于以下字段:

适用于发件人:AltFrom,DisplayFrom,DisplayFrom_2,dspFrom,ForwardedFrom,INetFrom,tmpDisplayFrom

For To:displaySendTo,EnterSendTo,Envelope_to,tmpDisplaySendTo

还尝试保存:docInbox.Save(true,true,true); * /

在成功编辑后的上述代码中,更改值不会反映在Nsf文件中。 但是,当我以编程方式阅读已编辑的Nsf(在不同位置复制修改后的文件)文件时,它会显示更改的值。(为什么此处无法看到更改?)

3 个答案:

答案 0 :(得分:0)

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

简要总结一下,一旦掌握了Document,就可以使用Items属性迭代该文档的所有现有字段(“items”);并且您可以使用ReplaceItemValue和/或AppendItemValue方法更新该文档上的给定字段。

答案 1 :(得分:0)

您是否使用Notes客户端检查结果?我想这种行为可以通过客户端相当积极的缓存来解释。在检查程序结果之前,请尝试从数据目录中删除文件cache.ndk

此外,Notes“Item”通常包含一组值 - 如果例如已向多个人发送邮件,则交换SendToFrom字段的方法将丢失数据。请尝试复制整个object[]

答案 2 :(得分:0)

我做过一次。

您必须为项目添加新引用,然后在“添加引用”对话框中选择“COM”。在列表中找到名为“Lotus Domino Objects”的组件并添加它。您将看到一个名为“Domino”的新引用添加到您的项目中。该COM组件由Lotus Notes客户端安装。您必须在开发计算机中安装它,并且在运行应用程序时也必须安装它。

从那时起,您可以使用在NotesDesigner中使用lotusscript进行开发时可用的大多数类。

添加适当的'using'语句:

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#thread存活,它就会在domino服务器中保持活着状态。为了解决这个问题,我不得不创建后台线程,并且只在线程中实例化新的NotesSession()对象。在启动之前,还必须使用STA单元模式设置线程。

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

我不确定这个问题是否真的是界面中的问题,或者我的代码中的其他错误。但如果有人面临这个问题:线程是我修复它的方式。