Outlook возвращает ошибку: интерфейс обмена сообщениями возвратил неизвестную ошибку - PullRequest
2 голосов
/ 29 декабря 2010

У меня возникли некоторые проблемы с фрагментом кода, я пытаюсь импортировать данные из источника (в настоящее время базы данных доступа) в пользовательскую форму, но я продолжаю получать вышеуказанную ошибку.

Когдая использую VBscript внутри исходной базы данных, все контакты импортируются правильно.Когда я чиню PST, он все еще дает эту ошибку.Когда я добавляю задержку 450 мс.ошибка также возникает, но позже в процессе.Открывать или закрывать Outlook не имеет значения.

Я использую следующий метод

string[] arrFolders = strFolders.Split('\\');

        Outlook.Application app = null;
        Outlook.MAPIFolder folder = null;

        try {
            app = new Outlook.Application();
            folder = app.GetNamespace("MAPI").Folders[arrFolders[0]];
        } catch (Exception ex) {
            writeLogLine("Error creating Outlook instance: " + ex.Message);
            MessageBox.Show("Error creating Outlook instance\r\n" + ex.Message);
            intErrorCount++;
            blnHasErrors = true;
            blnAbort = true;
        }

        try {
            for (int i = 1; i < arrFolders.Length; i++) {
                folder = folder.Folders[arrFolders[i]];
            }
        } catch (Exception ex) {
            writeLogLine("Error navigating to DRM folder: " + ex.Message);
            MessageBox.Show("Error navigating to DRM folder\r\n" + ex.Message);
            intErrorCount++;
            blnHasErrors = true;
            blnAbort = true;
        }

        setProgressbarMaximum(dtResults.Rows.Count);
        setProgressbarMode(ProgressBarStyle.Continuous);

        //int intRowCount = 0;

        foreach (DataRow drItem in dtResults.Rows) {

            if (strDRMType == "Contact") {
                try {
                    Outlook.ContactItem x = (Outlook.ContactItem)folder.Items.Add("IPM.Contact." + strFormName);

                    for (int i = 0; i < arrMappings.GetLength(0); i++) {

                        if (arrMappings[i, 1] != null && drItem[arrMappings[i, 0]].ToString() != "") {
                            x.UserProperties[arrMappings[i, 1]].Value = drItem[arrMappings[i, 0]].ToString();
                        }
                    }

                    x.Save();
                } catch (Exception ex) {
                    writeLogLine("Error importing contact: " + ex.Message);
                    intErrorCount++;
                    blnHasErrors = true;
                }
            }

, как я сказал, когда я повторяю код, он будет выдавать исключения после 100-200 контактов, когдая добавляю задержку, которую он получит для контакта 400/500 до сбоя.

Этот код предназначен для универсального инструмента импорта для этой конкретной формы, поэтому нет необходимости жестко кодировать имена исходных столбцов в форме.поля в коде импорта.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 01 мая 2011

Я предполагаю, что это не надстройка Outlook, так как вы говорите, что не имеет значения, открыт OL или закрыт, верно?

Одна вещь, которую вы можете сделать, это убедиться, что выосвобождение объектов COM, как только вы закончите с ними, используя System.Runtime.InteropServices.Marshal.ReleaseComObject (...).Кроме того, когда вы используете точечную нотацию, такую ​​как «namespace.Folders [..]. Name», вы фактически теряете ссылку как на объект коллекции Folders, так и на объект Folder.

Когда вы делаете папки(...) внутри цикла, который пропускает много объектов.

Итак, сначала очистите ваши ссылки COM и посмотрите, как это повлияет на вашу ситуацию.

Вот как я обычно используюCOM-объекты:

MyComLib.Foo foo = null;
try
{
   foo = new MyComLib.Foo();
   foo.DoSomething();
} catch(COMException exc)
{
   // handle error, or rethrow
}
finally
{
   if(foo != null)
      Marshal.ReleaseComObject(foo);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...