IBM Lotus Notes Domino DLL

时间:2014-07-09 20:54:46

标签: interop lotus-notes com-interop lotus-domino interop-domino

当基于NotesDXLExporter类的对象导出389条记录(这是一个较小的文档)导致第390条记录(这是一个大文档)时,Lotus Notes附带的Domino互操作API会导致.NET中出现内存不足异常)。

以下是代码段:

  1. 我初始化了NotesDXLExporter类。

    NotesDXLExporter dxl1 = null;

  2. 然后我配置NotesDXLExported对象,如下所示:

    dxl1 = notesSession.CreateDXLExporter(); dxl1.ExitOnFirstFatalError = false; dxl1.ConvertNotesbitmapsToGIF = true; dxl1.OutputDOCTYPE = false;

  3. 然后我在使用dxl1类读取文档时执行下面显示的循环(发生异常的行如下所示)。

    NotesView vincr = database.GetView(@"(AllIssuesView)"); //从NSF文件查看 for(int i = 1; i< vincr.EntryCount; i ++)             {                 尝试                 {

                    vincrdoc = vincr.GetNthDocument(i);
    
    
                        System.IO.File.WriteAllText(@"C:\Temp\" + i + @".txt", dxl1.Export(vincrdoc)); //OUT OF MEMORY EXCEPTION HAPPENS HERE WHEN READING A BIG DOCUMENT.
    
    
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                }
    
  4. 我尝试使用不同版本的Interop domino dll但没有成功。

    据我所知,我看到一个API问题,但我不知道我是否遗漏了什么?

    你能否对此有所了解?

    提前致谢。

    Subbu

1 个答案:

答案 0 :(得分:0)

您还没有说过您正在使用的Lotus Notes版本。鉴于DXL的历史,我想说你应该尽可能在最新版本的Notes上试用你的代码。

但是,我没有看到任何召回回收()。无法为Domino对象调用recycle()会导致内存从Domino后端类泄漏,并且由于内存不足,可能会导致您的问题。您也不应该使用for循环和getNthDocument。你应该使用getFirstDocument和一个带有getNextDocument的while循环。你会得到更好的表现。将这两个内容放在一起会导致您使用临时文档来保存getNextDocument的结果的常见模式,允许您回收当前文档,然后将临时文档分配给当前文档,这将是这样的(没有错误检查!)

NotesView vincr = database.GetView(@"(AllIssuesView)"); //view from an NSF file 
vincrdoc = vincr.getFirstDocument();
while (vincrdoc != null)
{ 
   try {
       System.IO.File.WriteAllText(@"C:\Temp\" + i + @".txt", dxl1.Export(vincrdoc));     
   }
   catch(Exception ex)
   {
       Console.WriteLine(ex);
   }
   Document nextDoc = vincr.getNextDocument(vincrdoc);
   vincrdoc.recycle();
   vincrdoc = nextDoc;

}