使用c#中的联系人ID检索Lotus Notes联系人信息

时间:2013-01-22 16:33:26

标签: c# lotus-notes

开发一个需要访问IBM Lotus Notes内的names.nsf数据库的工具,并使用lotus联系人ID(Employee ID)(此id将由用户提供),检索完整信息。人(姓名,职位,电话#....)

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

有没有办法在没有用户等待分钟的情况下完成此任务?

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

4 个答案:

答案 0 :(得分:1)

您使用的样本使用

浏览视图
NotesViewEntry viewEntry = notesViewCollection.GetNthEntry( rowCount );

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

有两种选择: 1)使用

优化此代码
NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();

并在最后

viewEntry = notesViewCollection.GetNextEntry(viewEntry);

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

这样的代码访问ViewEntry
LotusNotesView.GetEntryByKey( EmployeeID, true);

答案 1 :(得分:1)

如果幸运的话, names.nsf 是全文索引的。如果不是,你可以尝试询问它是否可以全文索引。当它被编入索引时,您可以像这样得到人员文档:

LotusNotesView.FTSearch("[EmployeeID]=1234567", 1);
NotesDocument docPerson = LotusNotesView.GetFirstDocument();

答案 2 :(得分: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);        
    }

答案 3 :(得分:0)

您为什么要求用户提供其员工ID?您应该让他提供他的Notes用户名(FullName或ShortName)或他的电子邮件地址。其中任何一个都可以在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数组,包括一堆内部使用值。