2010-12-29 2 views
2

Ich habe einige Probleme mit einem Stück Code, ich versuche, Daten von einer Quelle (zu diesem Zeitpunkt eine Access-Datenbank) in ein benutzerdefiniertes Formular zu importieren, aber ich behalte den obigen Fehler bekommen.Outlook gibt Fehler zurück: Die Nachrichtenschnittstelle hat einen unbekannten Fehler zurückgegeben

Wenn ich ein VBscript innerhalb der Quelldatenbank verwende, werden alle Kontakte korrekt importiert. Wenn ich die PST repariere, gibt es immer noch diesen Fehler. Wenn ich eine Verzögerung von 450 ms hinzufüge. der Fehler tritt auch später im Prozess auf. Es ist nicht wichtig, Outlook geöffnet oder geschlossen zu haben.

Ich verwende die folgende Methode

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

wie gesagt, wenn ich Schleife der Code es Ausnahmen nach 100 bis 200 Kontakte werfen, wenn ich eine Verzögerung hinzufügen, wird es kontaktieren 400/500 bevor Versagen.

Dieser Code soll für ein generisches Importwerkzeug für dieses spezifische Formular sein, so dass die Quellspaltennamen nicht in die Formularfelder im Importcode festgeschrieben werden müssen.

Jede Hilfe wird geschätzt.

+2

welche Ausnahmen? Wie schleifen Sie die Kontakte? –

+0

Die Ausnahme ist meistens leer mit Ausnahme der Meldung "Die Messaging-Schnittstelle hat einen unbekannten Fehler zurückgegeben. Wenn das Problem weiterhin besteht, starten Sie Outlook neu." Ich werde den Beitrag bearbeiten, um den vollständigen Code – Ronald

Antwort

0

Ich gehe davon aus, dass dies kein Outlook-Add-In ist, da Sie sagen, es ist egal, ob OL offen oder geschlossen ist, oder?

Eine Sache, die Sie tun können, ist sicherzustellen, dass Sie die COM-Objekte freigeben, sobald Sie fertig sind, mit System.Runtime.InteropServices.Marshal.ReleaseComObject (...). Wenn Sie Punktnotation wie "Namespace.Folders [..]. Name" verwenden, führen Sie tatsächlich einen Verweis auf dem Sammlungsobjekt Ordner und einem Ordner-Objekt.

Wenn Sie folders.Items.Add (...) innerhalb einer Schleife, die eine Menge von Objekten leckt.

Reinigen Sie also zuerst Ihre COM-Referenzen und sehen Sie, wie sich dies auf Ihre Situation auswirkt.

Hier ist, wie ich verwende in der Regel Objekte 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

ich versuchte 'Marshal.ReleaseComObject (x)' nach jedem 'x.Save()', aber ich habe immer noch eine Menge Fehler, meinst du, ich sollte den Ordner wieder öffnen Immer wenn ich ein Objekt hinzufüge? – Ronald

+0

Ich denke, Sie haben immer noch eine massive Anzahl von Referenzen. Was ist der Zweck dieses Codes? für (int i = 1; i

+0

Outlook.ContactItem x = (Outlook.ContactItem) folder.Items.Add ("IPM.Contact." + StrFormName); Dieser Code verliert die Items-Eigenschaft, stellen Sie also sicher, dass Sie diese freigeben. Lassen Sie folder.Items nicht im wahrsten Sinne des Wortes los, da nur eine neue Referenz erstellt und freigegeben wird. Weisen Sie dieser Eigenschaft eine Outlook.Folders-Variable zu und verwenden Sie diese Referenz. Wenn du damit fertig bist, lass es los. x.UserProperties [arrMappings [i, 1]]. Wert = drItem [arrMappings [i, 0]].ToString(); Dieser Code verliert das UserProperties-Objekt, also stellen Sie sicher, dass Sie dies auch explizit freigeben. –