我有一个读取很多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服务器的方法。 有线索吗? 非常感谢!
答案 0 :(得分:3)
没有尝试不打开数据库就无法确定数据库是否存在的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