2010-12-29 18 views
2

コードで問題が発生しました。ソースから(今のアクセスデータベースで)カスタムフォームにデータをインポートしようとしていますが、上記のエラーが発生します。Outlookでエラーが返されました:メッセージングインターフェイスから不明なエラーが返されました

ソースデータベース内でVBscriptを使用すると、すべての連絡先が正しくインポートされます。 私はPSTを修復するときにもこのエラーが発生します。 私は450ミリ秒の遅延を追加します。エラーも発生しますが、後でエラーが発生します。 Outlookを開いたり閉じたりしても問題ありません。

私はそれが前に400/500に連絡することになる遅延を追加したとき、私はループのコードが、それは、100〜200接触した後、例外がスローされますと、言ったように私は次のような方法

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; 
       } 
      } 

を使用しています失敗する。

このコードは、この特定のフォーム用の一般的なインポートツール用であるため、インポート列のソース列名をインポートコードのフォームフィールドにハードコーディングする必要はありません。

何か助けていただければ幸いです。

+2

は、ここで私は、通常のCOMオブジェクトを使用する方法は?連絡先をどのようにループするのですか? –

+0

"メッセージングインターフェイスから不明なエラーが返されました。問題が解決しない場合は、Outlookを再起動してください"というメッセージを除いて、ほとんど例外はありません。私は完全なコードを含むように投稿を編集します – Ronald

答えて

0

OLが開いているか閉じているかは関係ありませんが、これはOutlookアドインではないと想定しています。

あなたがしたいかもしれないことは、System.Runtime.InteropServices.Marshal.ReleaseComObject(...)を使用してCOMオブジェクトを解放していることを確実にすることです。また、 "namespace.Folders [..]。Name"のようなドット表記法を使用すると、実際にはFoldersコレクションオブジェクトとFolderオブジェクトの両方への参照がリークしています。

ループ内でfolders.Items.Add(...)を実行すると、多くのオブジェクトがリークします。

最初に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); 
} 
+0

各 'x.Save()'の後に 'Marshal.ReleaseComObject(x)'を試しましたが、まだ多くのエラーがあります。私はオブジェクトを追加するたびに? – Ronald

+0

あなたはまだ膨大な数のリファレンスを漏らしていると思います。このコードの目的は何ですか? for(int i = 1; i

+0

Outlook.ContactItem x =(Outlook.ContactItem)folder.Items.Add( "IPM.Contact。" + strFormName); このコードはItemsプロパティをリークします。したがって、リリースすることを確認してください。文字列としてfolder.Itemsを解放しないでください。新しい参照を作成してリリースするだけです。そのプロパティにOutlook.Folders変数を割り当て、その参照を使用します。それを済ませたら、放してください。 x.UserProperties [arrMappings [i、1]]。値= drItem [arrMappings [i、0]]。ToString(); このコードはUserPropertiesオブジェクトをリークします。したがって、明示的にもそれを解放してください。 –

関連する問題