0

不久前,我使用 C# 创建了一个程序,该程序对完全不同的程序进行了一些自动化操作,但发现我需要访问 Lotus Notes 数据库中的数据。唯一的问题是,我似乎只能弄清楚如何通过服务器名称打开数据库(使用 session.GetDatabase())......我无法弄清楚如何通过 Replica 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 更改,则不再工作。

4

2 回答 2

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 的数据库,就像单击 DBLink 或书签时 Notes 客户端所做的那样。但是,没有(或似乎)没有办法使用 Notes API 来做到这一点。

我的建议是按名称循环遍历潜在服务器的硬编码列表,并检查是否找到数据库(如果找不到数据库,则 OpenDatabaseByReplicaID 方法返回 ERR_SYS_FILE_NOT_FOUND(错误 0FA3))。如果这不是一个好的选择,也许您可​​以轻松地在应用程序的管理菜单中公开服务器名称,以便在服务器名称在某些时候更改时可以轻松更改。

于 2009-09-11T17:27:28.517 回答
1

set database = new NotesDatabase("") call database.OpenByReplicaID("repid")

于 2009-11-10T02:26:01.220 回答