如何在打开 Domino 数据库之前检查它是否存在?

How to check if a Domino database exists before opening it?

我有一个应用程序可以读取很多 domino 数据库。这些数据库分为主数据库和链接到主数据库的一些柜(或子数据库)。

但是这些数据库没有相同数量的机柜附加到它们。它从 1 到 15。 因为我需要阅读所有这些文件(目前有 93 个数据库),所以我曾经列出所有 nsf 文件的路径并一一阅读。但是,机柜的数量会随时间变化,这意味着我需要定期检查是否需要添加新文件。而我不想那样做... 所以我想到了另一种方法:我只列出了 nsf 文件名的模板(所有的柜子都被命名为 database00.nsf, database01.nsf, etc,所以很容易在运行时生成这些文件名,当我尝试打开数据库和得到一个 COMException,我假设该数据库不存在,并将其从我的列表中删除。 但!这太慢了,绝对不是一个好习惯!

这是我目前拥有的。 _listDBs 包含数据库 nsf 文件的路径列表,tmplist 是临时列表,稍后用于清理 _listDbs

foreach (var pair in _listDBs)
{
    try
    {
        NotesDatabase notedb = _notesSession.GetDatabase(_lotusRoot, pair.Value);
        //other stuff here, not important
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        tmplist.Add(pair);
    }
}

我必须等待引发 COMException 以确定数据库不存在。 我宁愿先检查 nsf 文件是否存在。但我找不到办法做到这一点。我找不到以不同方式导航 Domino 服务器的方法。 有线索吗? 非常感谢!

没有 100% 的方法可以在不尝试打开数据库的情况下确定数据库是否存在。您可以浏览 catalog.nsf 中的文档并检查是否有一个适合您的路径,但此数据库仅每晚更新一次,并且在您检查时可能已过时。

但是:您可以反过来:使用 NotesDbDirectory,遍历它并检查数据库的文件路径是否与您的列表匹配。

NotesDbDicrectory 包含服务器上的所有数据库,并且循环非常快。

由于我不熟悉 c#,这里是从 Designer 帮助中获取的 Visual Basic 的 COM 示例

Dim s As New NotesSession
s.Initialize
Dim dir As NotesDbDirectory
Dim db As NotesDatabase
Set dir = s.GetDbDirectory("Snapper")
Set db = dir.GetFirstDatabase(NOTES_DATABASE)
While Not (db Is Nothing)
  ˋCheck db.Filename or db.Filepath here
  Set db = dir.GetNextDatabase
Wend