我在使用一段代码时遇到了一些问题,我试图将数据从源(此时是访问数据库)导入到自定义表单中,但我一直遇到上述错误。
当我在源数据库中使用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。
此代码应该用于此特定表单的通用导入工具,因此无需将源列名称硬编码到导入代码中的表单字段。
感谢任何帮助。
答案 0 :(得分:0)
我假设这不是Outlook加载项,因为你说OL是开放还是关闭无关紧要,对吗?
您可能想要做的一件事是确保在完成COM对象后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject(...)释放它们。此外,当您使用像“namespace.Folders [..] .Name”这样的点表示法时,您实际上是在泄露对Folders集合对象和Folder对象的引用。
当你在循环中执行folders.Items.Add(...)时,会泄漏很多对象。
因此,首先清理您的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);
}