IBM Domino:如何合并两个数据库中的NotesDocument?
解决跨数据库合并文档到NotesDocumentCollection的问题
你遇到的Error 4427完全是Notes API的设计限制——NotesDocumentCollection的AddDocument和Merge方法都严格要求操作的文档必须属于创建该集合的数据库,没法直接绕过这个约束。不过根据你的需求场景,有两种实用的解决思路:
方案一:复制文档到目标库后加入集合
如果你的业务允许在目标数据库(比如你说的常规库)中创建归档文档的副本,那这是最直接的办法:先把归档库的文档复制到目标库,再将复制后的本地文档添加到集合里。示例代码如下:
' 假设targetDb是你要创建集合的目标数据库(常规库) ' sourceDoc是来自归档库的文档 Set copiedDoc = sourceDoc.CopyToDatabase(targetDb) If Not copiedDoc Is Nothing Then Set result = targetDb.CreateDocumentCollection Call result.AddDocument(copiedDoc) ' 循环添加其他需要合并的文档... End If
注意:复制后的文档会生成新的UNID,如果你需要保留原归档文档的唯一标识,可以把原UNID存到副本文档的自定义字段里。
方案二:用数组/列表存储跨库文档引用
如果不需要在目标库创建文档副本,只是需要“合并”文档引用以便后续统一处理,那可以放弃NotesDocumentCollection,改用Variant数组或者列表来存储来自不同数据库的文档对象。示例代码:
Dim docList As Variant ReDim docList(0) As NotesDocument ' 添加来自常规库的文档 Set docList(0) = regularDb.GetDocumentByUNID("常规库文档UNID") ' 扩容数组并添加来自归档库的文档 ReDim Preserve docList(1) As NotesDocument Set docList(1) = archiveDb.GetDocumentByUNID("归档库文档UNID") ' 遍历合并后的文档列表,执行你的业务逻辑 For i = LBound(docList) To UBound(docList) Set currentDoc = docList(i) ' 比如读取字段:MsgBox currentDoc.GetItemValue("Title")(0) Next
这种方式只是存储文档的引用,不会修改原数据库的内容,适合只需要读取或处理文档数据的场景。
额外提示
如果你的需求是批量操作(比如批量删除、批量更新),那建议分别对每个数据库的NotesDocumentCollection执行操作,因为Notes的批量API几乎都依赖同库的文档集合,跨库批量操作很难通过单一集合实现。
内容的提问来源于stack exchange,提问作者Frank Yuan
相关产品推荐
相关产品推荐

