Как редактировать файл NSF с помощью C #? - PullRequest
0 голосов
/ 11 ноября 2009

Я хочу программно изменить некоторые значения на элемент NSF, а затем сохранить его (т. Е. Отредактировать файл NSF, а затем сохранить издания)

например:

Я хочу установить для имени отправителя всех писем preeti@abc.com (с использованием Domino.dll).

Решение, которое я пробовал: (Обмен значениями To и From)

String Temp_From = ((object []) docInbox.GetItemValue ("From")) [0] as String; String Temp_SendTo = ((object []) docInbox.GetItemValue ("SendTo")) [0] as String; docInbox.ReplaceItemValue ("From", Temp_SendTo); docInbox.ReplaceItemValue ("SendTo", Temp_From); docInbox.Save (true, false, false);

/ * Применяется также для следующих полей:

Для From: AltFrom, DisplayFrom, DisplayFrom_2, dspFrom, ForwardedFrom, INetFrom, tmpDisplayFrom

Для Кому: displaySendTo, EnterSendTo, Envelope_to, tmpDisplaySendTo

Также пытался сохранить: docInbox.Save (true, true, true); * /

В приведенном выше коде после успешного редактирования изменения значений не отражаются в Nsf File. Но когда я читаю отредактированный файл Nsf (копирование измененного файла в другое место) программно, он показывает измененные значения. (Почему изменения здесь не видны?)

Ответы [ 3 ]

0 голосов
/ 12 ноября 2009

Проверяете ли вы результат с помощью клиента Notes? Полагаю, такое поведение можно объяснить довольно агрессивным кэшированием клиента. Попробуйте удалить файл cache.ndk из каталога данных, прежде чем проверять результат вашей программы.

Кроме того, «Элемент» Notes обычно содержит массив значений - ваш подход к замене полей SendTo и From приведет к потере данных, если, например, письмо было отправлено нескольким людям. Попробуйте вместо этого скопировать весь object[].

0 голосов
/ 21 июля 2016

Я сделал это один раз.

Вы должны добавить новую ссылку в свой проект и выбрать «COM» в диалоговом окне «Добавить ссылку». Найдите в списке компонент с именем «Объекты Lotus Domino» и добавьте его. Вы увидите новую ссылку под названием «Domino», добавленную в ваш проект. Этот COM-компонент устанавливается Lotus Notes Client. Он должен быть у вас на компьютере разработчика, и он также должен быть установлен при запуске приложения.

С этого момента вы можете использовать большинство доступных вам классов при разработке с lotusscript в NotesDesigner.

Добавить соответствующий оператор using:

using Domino;

Создать сеанс заметок:

NotesSession session = new NotesSession();
session.Initialize("mypassword");
//this uses your current Notes location and id.
//i think you can use session.Initialize("") if notes is already running and you are already logged in.

Получить базу данных:

NotesDatabase notesDb = session.GetDatabase("server", "database", false);

Получить некоторые документы, например: сегодняшние встречи (если база данных, которую вы открыли, это ваш mail.nsf)

NotesDocumentCollection col = null;
try { col = notesDb.Search("Form = \"Appointment\" & StartDate = @Today", null, 0); }
catch (Exception e) { }

Итерация по вашей коллекции:

if (null != col)
{
    NotesDocument doc = col.GetFirstDocument();
    while (doc != null)
    {
        //do your magic tricks
        doc = col.GetNextDocument(doc);
    }
}    

Одна проблема, с которой я столкнулся в этом интерфейсе: нет ни метода session.Close (), ни чего-либо подобного, и мои сеансы не закрывались на сервере, когда GC собирал объект C #. После того, как я открыл новый NotesSession (), он оставался живым на сервере домино, пока мой c # поток был жив. Чтобы решить эту проблему, мне пришлось создавать фоновые потоки и создавать экземпляры только новых объектов NotesSession () из потоков. Потоки также должны были быть настроены в режиме квартиры STA перед запуском.

Thread thread = new Thread(new ThreadStart(MyFunctionThatInstantiatesNewNotesSessions));
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
thread.Join();

Я не уверен, является ли эта проблема действительно проблемой в интерфейсе, или что-то еще, что я сделал неправильно в своем коде. Но если кто-то сталкивается с этой проблемой: нити - это то, как я ее исправил.

0 голосов
/ 11 ноября 2009

«Руководство по программированию, Том 2: Классы LotusScript / COM / OLE» можно найти здесь: http://www -12.lotus.com / LDD / DOC / uafiles.nsf / документы / DESIGNER70 /

Однако, как краткое резюме, если у вас есть дескриптор для документа, вы можете перебирать все существующие поля («элементы») в этом документе, используя свойство Items; и вы можете обновить данное поле в этом документе, используя методы ReplaceItemValue и / или AppendItemValue.

...