C# 在c中使用联系人ID检索Lotus Notes联系人信息#
我正在开发一个工具,需要访问IBM Lotus Notes中的names.nsf数据库,并使用Lotus联系人ID(员工ID)(此ID将由用户提供)检索此人的完整信息(姓名、职位、电话等) 我在Codeproject.com()上找到了一个例子,但是按照这个例子的方式获取信息大约需要10分钟(数据库有大约5000个条目),所以我正在寻找一种更快的方法(如果我真的使用LotusNotes,大约需要一秒钟!) 有没有一种方法可以在用户不等待几分钟的情况下完成此任务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,大约需要一秒钟!) 有没有一种方法可以在用户不等待几分钟的情况下完成此任务 我想也许你可以帮我解决这个问题。使
我想也许你可以帮我解决这个问题。使用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添加一个自定义视图。但是,大多数管理员会拒绝此请求,但您的管理员可能会允许此请求。如果他们允许,那么你需要一个