【问题标题】:How to Edit NSF file using c#?如何使用 C# 编辑 NSF 文件?
【发布时间】:2009-11-11 09:28:35
【问题描述】:

我想以编程方式将一些值更改为 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

对于 To : displaySendTo,EnterSendTo,Envelope_to,tmpDisplaySendTo

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

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

【问题讨论】:

  • 当您说更改的值未反映在 NSF 文件中时 - 您如何查看 NSF?如果通过 Notes 客户端中的视图,很可能该视图尚未刷新。尝试使用文档属性来查看实际的基础字段值。此外,请确认视图使用的是您更改的相同字段。

标签: c# lotus-notes interop-domino


【解决方案1】:

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

不过,作为一个简短的总结,一旦您有了一个 Document 的句柄,您就可以使用 Items 属性遍历该文档上的所有现有字段(“items”);并且您可以使用 ReplaceItemValue 和/或 AppendItemValue 方法更新该文档上的给定字段。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我做过一次。

      您必须为您的项目添加一个新引用并在“添加引用”对话框中选择“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();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多