1

我正在开发一个工具,该工具需要访问 IBM Lotus Notes 中的 names.nsf 数据库,并使用 Lotus 联系人 ID(员工 ID)(此 ID 将由用户提供),检索此人的完整信息(姓名, 职位, 电话号码....)

我在 Codeproject.com ( http://www.codeproject.com/Articles/18517/Lotus-Notes-Integration-with-Microsoft-NET-Platfor )上找到了一个示例,但是以这种方式获取信息大约需要 10 分钟这个例子做到了(数据库大约有 5000 个条目),所以我正在寻找一种更快的方法(如果我真的为此使用 Lotus notes 大约需要一秒钟!)。

有没有办法在不让用户等待几分钟的情况下完成这项任务?

想也许你可以帮我解决这个问题。

4

4 回答 4

1

您正在使用的示例通过视图使用

NotesViewEntry viewEntry = notesViewCollection.GetNthEntry( rowCount );

这是(之一)最糟糕的方法,因为它从视图顶部进行每次迭代并遍历所有文档,直到它到达第 n 个文档。

有两种选择:1)通过使用优化此代码

NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();

最后

viewEntry = notesViewCollection.GetNextEntry(viewEntry);

2)(以我的拙见,更好的方法):更改代码:-您需要一个视图,其中第一列按您的键排序 => 联系人 ID(员工 ID)-您可以通过以下代码访问 ViewEntry

LotusNotesView.GetEntryByKey( EmployeeID, true);
于 2013-01-22T16:49:52.667 回答
1

如果幸运的话,names.nsf会被全文索引。如果不是,您可以尝试询问它是否可以被全文索引。当它被索引时,您可以像这样快速获取人员文档:

LotusNotesView.FTSearch("[EmployeeID]=1234567", 1);
NotesDocument docPerson = LotusNotesView.GetFirstDocument();
于 2013-01-22T17:50:12.470 回答
0

为什么要求用户提供他的员工 ID?您应该要求他提供他的 Notes 用户名(全名或简称)或他的电子邮件地址。其中任何一个都可以在 names.nsf 的 $Users 视图中快速查找,让您可以快速访问包含您需要的所有数据的文档。

注意:我知道有些公司实际上将他们的员工 ID 输入到 names.nsf 的 ShortName 字段中。如果您的组织是这种情况,那么您应该做的是NotesView使用该方法打开一个对象NotesDatabase.getView(),然后使用 NotesView.getDocumentByKey() 方法为用户获取文档。例如,像这样:

NotesView usersView = namesDb.getView("$Users");
NotesDocument userDoc = usersView.getDocumentByKey(employeeId);

然后只需读取您想要的数据,对您感兴趣的每个信息字段使用 userDoc.getItemValue()。如果您真的想捕获所有内容,包括一堆,您应该只对整个 userdoc.Items 数组进行循环内部使用价值。

于 2013-01-22T19:16:49.387 回答
0

使用 GetNthEntry 肯定会导致一些性能问题。我已经从该站点获取了相关代码,并将其重写为使用 GetFirst/GetNext 模式,推荐用于 Lotus Notes 中的所有视图处理。

请注意,这当然没有经过测试。关键是获取集合中的第一个条目,检查它是否是一个对象,然后处理它。在循环结束时,获取下一个条目并重复,直到您命中 null。

    NotesViewEntryCollection  notesViewCollection = LotusNotesView.AllEntries;
    NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();

    while (viewEntry != null)
    {
        //Get the first document of particular entry.
        NotesDocument document =  viewEntry.Document;

        object documentItems = document.Items;
        Array itemArray1 = (System.Array)documentItems;

        for( int itemCount=0 ; itemCount< itemArray1.Length; itemCount++ )
        {
            NotesItem notesItem = 
            (Domino.NotesItem)itemArray1.GetValue( itemCount );

            //compare field value with specific value entered by user
            if( notesItem.Text !=null )
            {
                if( (notesItem.Text.ToUpper()).StartsWith( fieldValue ))
                {
                    Contact contact = new Contact();
                    for( int icount=0 ; icount< itemArray1.Length; icount++ )
                    {
                        NotesItem searchedNotesItem =
            (Domino.NotesItem)itemArray1.GetValue( icount );
                        string FieldName = searchedNotesItem.Name.ToString();
                        //For FirstName
                        if( searchedNotesItem.Name == "FirstName" )
                            contact.FirstName= searchedNotesItem.Text;

                        //For LastName
                        if( searchedNotesItem.Name == "LastName" )
                            contact.LastName = searchedNotesItem.Text;
                        //For Office Phone Number
                        if( searchedNotesItem.Name == "OfficePhoneNumber" )
                            contact.OfficePhoneNumber = searchedNotesItem.Text;

                        if( searchedNotesItem.Name  == "InternetAddress" )
                            contact.EmailId = searchedNotesItem.Text;

                    }//end for
                    contactsList.Add( contact );
                    break;
                }//End if
            }
        }

        //Get the nth entry of the selected view according to the iteration.
        NotesViewEntry viewEntry = notesViewCollection.GetNextEntry(viewEntry);        
    }
于 2013-01-22T16:46:20.210 回答