Откройте базу данных Lotus Notes по идентификатору реплики в C # - PullRequest
0 голосов
/ 11 сентября 2009

Я недавно создал программу с использованием 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 ]

2 голосов
/ 11 сентября 2009

вам нужно будет использовать метод 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, чтобы он извлекал базу данных с конкретным replicaID с ближайшего к клиенту сервера, как это делает Notes-клиент, когда вы нажимаете DBLink или Bookmark. Тем не менее, нет (или, кажется, нет) никакого способа сделать это с помощью API Notes.

Мое предложение состоит в том, чтобы либо пройти через жестко закодированный список потенциальных серверов по имени, и проверить, найдена ли база данных (метод OpenDatabaseByReplicaID возвращает ERR_SYS_FILE_NOT_FOUND (ошибка 0FA3), если база не найдена). Если это не очень хороший вариант, возможно, вы легко можете указать имя сервера в меню администратора вашего приложения, чтобы его можно было легко изменить, если в какой-то момент имя сервера изменится.

1 голос
/ 10 ноября 2009

set database = new NotesDatabase ("") вызовите database.OpenByReplicaID ("repid")

...