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

C# 在c中使用联系人ID检索Lotus Notes联系人信息#,c#,lotus-notes,C#,Lotus Notes,我正在开发一个工具,需要访问IBM Lotus Notes中的names.nsf数据库,并使用Lotus联系人ID(员工ID)(此ID将由用户提供)检索此人的完整信息(姓名、职位、电话等) 我在Codeproject.com()上找到了一个例子,但是按照这个例子的方式获取信息大约需要10分钟(数据库有大约5000个条目),所以我正在寻找一种更快的方法(如果我真的使用LotusNotes,大约需要一秒钟!) 有没有一种方法可以在用户不等待几分钟的情况下完成此任务 我想也许你可以帮我解决这个问题。使

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

我在Codeproject.com()上找到了一个例子,但是按照这个例子的方式获取信息大约需要10分钟(数据库有大约5000个条目),所以我正在寻找一种更快的方法(如果我真的使用LotusNotes,大约需要一秒钟!)

有没有一种方法可以在用户不等待几分钟的情况下完成此任务


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

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

注意,这当然还没有经过测试。关键是获取集合中的第一个条目,检查它是否为对象,然后对其进行处理。在循环结束时,获取下一个条目并重复,直到达到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);        
    }
NotesViewEntryCollection notesViewCollection=LotusNotesView.AllEntries;
NotesViewEntry=notesViewCollection.GetFirstEntry();
while(viewEntry!=null)
{
//获取特定条目的第一个文档。
NotesDocument文档=viewEntry.document;
对象documentItems=document.Items;
Array itemArray1=(System.Array)documentItems;
对于(int-itemCount=0;itemCount
您正在使用的示例将使用

NotesViewEntry viewEntry = notesViewCollection.GetNthEntry( rowCount );
这是(其中一个)最糟糕的方法,因为它从视图顶部开始每次迭代,并迭代所有文档,直到到达第n个文档

有两种选择: 1) 通过使用

NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();
最后呢

viewEntry = notesViewCollection.GetNextEntry(viewEntry);
2) (以我的拙见,更好的方式):更改代码: -您需要一个按key=>contact-ID(Employee-ID)排序的第一列视图 -您可以通过以下代码访问ViewEntry:

LotusNotesView.GetEntryByKey( EmployeeID, true);
如果幸运的话,names.nsf是全文索引的。如果不是,你可以试着问它是否可以全文索引。编制索引后,您可以像这样快速获取person文档:

LotusNotesView.FTSearch("[EmployeeID]=1234567", 1);
NotesDocument docPerson = LotusNotesView.GetFirstDocument();
NotesView usersView = namesDb.getView("$Users");
NotesDocument userDoc = usersView.getDocumentByKey(employeeId);

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

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

LotusNotesView.FTSearch("[EmployeeID]=1234567", 1);
NotesDocument docPerson = LotusNotesView.GetFirstDocument();
NotesView usersView = namesDb.getView("$Users");
NotesDocument userDoc = usersView.getDocumentByKey(employeeId);

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

您有第二次尝试过吗?听起来好像视图没有在names.nsf中建立索引。是的,我试了很多次。结果相同。您指向的示例代码使用的是local names.nsf数据库。你在这么做吗?或者您正在访问Domino服务器上的names.nsf数据库?这有点离题,但为什么不使用LDAP查询Domino目录呢?我正在访问Domino服务器。这个例子有从服务器获取的选项,对吗?嗨,你能更具体一点吗?当你说我需要一个第一列按EmployeeID键排序的视图时,我没有得到这个部分。感谢您的帮助,非常感谢他说您应该让Domino管理员为您的Names.nsf添加一个自定义视图。但是,大多数管理员会拒绝此请求,但您的管理员可能会允许此请求。如果他们允许,那么你需要一个