在C#中按副本标识打开Lotus Notes数据库

时间:2009-09-11 16:21:07

标签: c# interop lotus-notes

我前段时间使用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更改,则不再有任何工作。

2 个答案:

答案 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”)