开发一个需要访问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笔记需要大约一秒钟!)。
有没有办法在没有用户等待分钟的情况下完成此任务?
想到也许你可以帮我解决这个问题。
答案 0 :(得分:1)
您使用的样本使用
浏览视图NotesViewEntry viewEntry = notesViewCollection.GetNthEntry( rowCount );
这是(一种)最糟糕的方法,因为它从视图的顶部开始每次迭代,并遍历所有文档,直到它到达第n个文档。
有两种选择: 1)使用
优化此代码NotesViewEntry viewEntry = notesViewCollection.GetFirstEntry();
并在最后
viewEntry = notesViewCollection.GetNextEntry(viewEntry);
2)(以我的拙见,更好的方式):更改代码: - 您需要一个视图,第一列按您的键排序=>联系人ID(员工ID) - 您可以通过像
这样的代码访问ViewEntryLotusNotesView.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数组,包括一堆内部使用值。