运行MS ACCESS宏的C#Interop错误

时间:2018-08-07 18:04:46

标签: c# ms-access office-interop

我用C#开发了一个命令行应用程序,该应用程序在MS ACCESS中运行一些宏,但是在生产环境中出现以下错误:

System.Runtime.InteropServices.COMException (0x800A09B6): You can´t carry out this action at the present time.
at Microsoft.Office.Interop.Access.DoCmd.RunMacro(Object MacroName, Object RepeatCount, Object RepeatExpression)

当我再次运行该应用程序时,它运行正常。

这是代码:

public void RunMacros()
{            
    Application access = null;
    _runningMacros = true;
    CloseMessageBox("Microsoft Access");    // Thread to close MsgBoxes 
    try
    {       
        access = new Application();
        access.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityLow;

        var databases = MdbSettings.Config.Databases;
        for (var mdbIndex = 0; mdbIndex < databases.Count; mdbIndex++)
        {
            if (databases[mdbIndex].Type == ReportType)
            {
                var mdbFile = databases[mdbIndex].File;
                if (mdbFile.StartsWith("OcnTs*", StringComparison.InvariantCultureIgnoreCase))
                {
                    mdbFile = mdbFile.Replace("*", Settings.DateReplaceName);
                }
                var mdbFullPath = GetFileFullPath(mdbFile, MdbPath);
                access.OpenCurrentDatabase(mdbFullPath, Settings.IsDbExclusive);
                for (var macrosIndex = 0; macrosIndex < databases[mdbIndex].Macros.Count; macrosIndex++)
                {                            
                    var macro = databases[mdbIndex].Macros[macrosIndex].Name;
                    var message = string.Format("{0}, macro: {1}", Path.GetFileName(mdbFullPath), macro);
                    Log.Write(message);                            
                    access.DoCmd.RunMacro(macro);   
                }
                access.CloseCurrentDatabase();
            }
        }
        _runningMacros = false;     
        access.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveNone);
        Marshal.ReleaseComObject(access);
        access = null;
    }            
    catch (Exception ex)
    {
        Log.Write(ex.ToString());
        try
        {
            Marshal.ReleaseComObject(access);
        }
        catch (Exception e)
        {
            Log.Write("Error realeasing Access application: " + e.ToString(), Log.Severity.Warning);
        }
        throw;
    }         
}

有人可以帮我解决错误吗?

编辑:
-该错误仅在生产环境中发生
-生产环境已安装MS Access 2010
-开发环境已安装MS Access 2016
-每个宏在6到20个查询之间运行
-错误并非总是出现在同一宏中

0 个答案:

没有答案