Access.Application App = null;
Access.Dao.Database db = null;
try
{
object ObjOpt = System.Reflection.Missing.Value;
App = new Access.Application();
App.OpenCurrentDatabase("\\\\Template\\App.accdb", false, null);
Access.Dao.DBEngine dbEngine = new Access.Dao.DBEngine();
db = dbEngine.OpenDatabase("\\\\Template\\App.accdb", ObjOpt, false, ObjOpt);
db.QueryDefs["Отчет"].SQL = "exec dbo.USP_Rep_Trades_Information \"" + Form.DateParam.ToString("dd.MM.yyyy") + "\"";
SaveFileDialog SFD = new SaveFileDialog();
SFD.Filter = "Файлы ADOBE PDF (*.pdf)|*.pdf|Все файлы (*.*)|*.*";
SFD.FileName = SFD.FileName + "Отчет.pdf";
if (SFD.ShowDialog(this) == DialogResult.OK)
{
Cursor = System.Windows.Forms.Cursors.WaitCursor;
App.DoCmd.OutputTo(
Microsoft.Office.Interop.Access.AcOutputObjectType.acOutputReport,
"Отчет",
"PDF",
SFD.FileName,
Form.AutoStart,
ObjOpt,
ObjOpt
);
};
}
catch (Exception Ex)
{
MessageBox.Show(
this,
Ex.Message,
@"Формирование отчета ""Отчет""",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
finally
{
if (db != null)
{
db.Close();
db = null;
};
if (App != null)
{
App.CloseCurrentDatabase();
App = null;
};
GC.Collect();
GC.WaitForPendingFinalizers();
Cursor = System.Windows.Forms.Cursors.Arrow;
};
Interop и BackgroundWorker
Обнаружил, что некоторые функции, которые прекрасно работают в основном потоке, а если их вынести в отдельный поток, то они перестают работать. Примером того служит работа Interop с вызовом отчета из MS Access'а:
Код:
При выполнении этого кода отдельным потоком, при использовании BackgroundWorker'а возникает ошибка, скриншот которой представлен во вложении.
Ошибка происходит на строчке:
Код:
db = dbEngine.OpenDatabase("\\\\Firewall\\Template\\App.accdb", ObjOpt, false, ObjOpt);
Почему так происходит и возможно ли победить данную проблему?