我前段时间使用C#创建了一个程序,它为一个完全不同的程序做了一些自动化,但发现我需要从Lotus Notes数据库访问数据。唯一的问题是,我似乎只能弄清楚如何通过服务器的名称打开数据库(使用session.GetDatabase())...我无法弄清楚如何通过副本ID打开它。有谁知道我会怎么做? (我不希望每次服务器更改时我的程序都会关闭。)
public static string[] GetLotusNotesHelpTickets()
{
NotesSession session = new NotesSession();
session.Initialize(Password);
// 85256B45:000EE057 = NTNOTES1A Server Replica ID
NotesDatabase database = session.GetDatabase("NTNOTES1A", "is/gs/gshd.nsf", false);
string SearchFormula = string.Concat("Form = \"Call Ticket\""
, " & GroupAssignedTo = \"Business Systems\""
, " & CallStatus = \"Open\"");
NotesDocumentCollection collection = database.Search(SearchFormula, null, 0);
NotesDocument document = collection.GetFirstDocument();
string[] ticketList = new string[collection.Count];
for (int i = 0; i < collection.Count; ++i)
{
ticketList[i] = ((object[])(document.GetItemValue("TicketNumber")))[0].ToString();
document = collection.GetNextDocument(document);
}
document = null;
collection = null;
database = null;
session = null;
return ticketList;
}
此代码工作正常,但如果服务器从NTNOTES1A更改,则不再有任何工作。
答案 0 :(得分:2)
您需要使用notesDbDirectory.OpenDatabaseByReplicaID(rid $)方法。要获取NotesDbDirectory,可以使用会话的getDbDirectory方法
Set notesDbDirectory = notesSession.GetDbDirectory( serverName$ )
因此,您可以使用以下代码通过replicaID获取数据库。
public static string[] GetLotusNotesHelpTickets()
{
NotesSession session = new NotesSession();
session.Initialize(Password);
Set notesDBDirectory = session.GetDbDirectory("NTNOTES1A")
// 85256B45:000EE057 = NTNOTES1A Server Replica ID
NotesDatabase database = notesDBDirectory.OpenDatabaseByReplicaID("85256B45:000EE057")
string SearchFormula = string.Concat("Form = \"Call Ticket\""
, " & GroupAssignedTo = \"Business Systems\""
, " & CallStatus = \"Open\"");
NotesDocumentCollection collection = database.Search(SearchFormula, null, 0);
NotesDocument document = collection.GetFirstDocument();
string[] ticketList = new string[collection.Count];
for (int i = 0; i < collection.Count; ++i)
{
ticketList[i] = ((object[])(document.GetItemValue("TicketNumber")))[0].ToString();
document = collection.GetNextDocument(document);
}
document = null;
collection = null;
database = null;
session = null;
return ticketList;
}
不幸的是,这只能解决你问题的一半。我知道您只需告诉Notes从最靠近客户端的服务器获取具有特定副本ID的数据库,就像Notes客户端单击DBLink或书签时所做的那样。但是,使用Notes API(或似乎)没有办法使用Notes API。
我的建议是按名称循环浏览潜在服务器的硬编码列表,并检查是否找到了数据库(如果找不到数据库,OpenDatabaseByReplicaID方法返回ERR_SYS_FILE_NOT_FOUND(错误0FA3))。如果这不是一个好的选择,也许您可以在应用程序的管理菜单中轻松公开服务器名称,以便在服务器名称在某些时候更改时可以轻松更改。
答案 1 :(得分:1)
set database = new NotesDatabase(“”) call database.OpenByReplicaID(“repid”)