C#-将Access Mdb转换为Accdb-错误80040154以启动Interop.Access.Application

时间:2018-07-06 10:10:52

标签: c# ms-access

我正在用C#开发一个小型工具来转换基本的mdb accdb。它必须在Windows服务器上运行。

为此,我使用了Microsoft.Office.Interop.Access.dll

问题是当我要启动应用程序时:

accessApp = new Microsoft.Office.Interop.Access.Application();

我有以下错误:

  

由于以下错误,类工厂恢复已添加到CLSID错误{73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}中:80040154未注册类(异常HRESULT:0x80040154(REGDB_E_CLASSNOTREG))。

我用 Regasm 命令保存了dll,但还是一样。我还尝试在x86,x64和任何CPU上启动。

完整的代码:

class Program
{
    public static Access.Application accessApp { get; set; }
    static void Main(string[] args)
    {

        try
        {
            accessApp = new Microsoft.Office.Interop.Access.Application();
            accessApp.Visible = true;
            string sourceFile = @"D:\Biwee\Bases\styzan.mdb";
            string desFile = @"D:\Biwee\Bases\database3.accdb";
            //CompactAndRepair(sourceFile, accessApp);
            accessApp.ConvertAccessProject(sourceFile, desFile, Access.AcFileFormat.acFileFormatAccess2007);
            accessApp.Quit();
        }
        catch(Exception message)
        {
            var error = message;
            Console.WriteLine("Erreur : " + message);
            Console.Read();
            if(accessApp != null)
            accessApp.Quit();
        }
        Console.Read();
    }

    public static void CompactAndRepair(string accessFile, Access.Application app)
    {
        string tempFile = Path.Combine(Path.GetDirectoryName(accessFile),
                          Path.GetRandomFileName() + Path.GetExtension(accessFile));

        app.CompactRepair(accessFile, tempFile, false);
        app.Visible = false;

        FileInfo temp = new FileInfo(tempFile);
        temp.CopyTo(accessFile, true);
        temp.Delete();
    }
}

谢谢您的帮助。

答案:

解决方案是以下解决方案,必须使用Access Database Engine 2010 (x86 or 64)来管理mdb和accdb。

代码如下:

object[] args = new object[2]
{
(object) SourceDbMDB,
(object) DestDbACCDB
};
object instance = Activator.CreateInstance(Type.GetTypeFromProgID("DAO.DBEngine.120"));
instance.GetType().InvokeMember("CompactDatabase", BindingFlags.InvokeMethod, (Binder)null, instance, args);
Marshal.ReleaseComObject(instance);

我开发了一个用于运行转换的应用程序(必要时以管理员身份首次打开以安装引擎);

然后只需在cmd中运行以下命令:

call "ExePath" "MdbPath"

https://github.com/ColvrayC/App.ConvertMdbToAccdb

0 个答案:

没有答案