[使用线程使用C#的Access 2016问题

问题描述 投票:0回答:1

我正在尝试从C#应用程序打开访问连接。正在通过以下方法打开连接:

            ADOX.CatalogClass cat = new ADOX.CatalogClass();



            System.IO.File.Delete(_AccessDatabaseName);
            cat.Create("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _AccessDatabaseName + "; Jet OLEDB:Engine Type=5");
            cat = null;

            _ErrorMessage = "";
            return (true);

一切正常,直到我在Office 2016中使用后台工作者/线程调用这些方法。我收到以下错误:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。有时甚至是这样:无可用的错误消息,结果代码:E_UNEXPECTED(0x8000FFFF)。它接缝的ldb接缝仍处于打开状态,因此当我在创建mdb文件以创建/插入任何其他表后无法访问mdb文件时。我安装了accessruntime_4288-1001_x64_en-us.exeAccessDatabaseEngine_X64.exe,但存在相同的错误。即使在尝试使用cat.Create创建mdb时,应用程序也会冻结,直到我不得不强制关闭它为止。

任何帮助都会很棒。

c# multithreading ms-access-2016
1个回答
0
投票

我一直在为相同的问题寻找合适的解决方案,但没有成功。我的解决方法是不使用任何后台线程,或者,如果需要后台线程,则使用带有“ OLE DB SERVICES = -1”的连接字符串来启用池,以便其他连接可以重用ldb或laccdb,而无需创建新的。但是,如果在2016 Access Engine中超时(1分钟)后锁定文件消失,则池将呈现重新打开连接错误。因此,一个愚蠢的解决方案是创建另一个线程来打开连接并每分钟关闭它。

这似乎是MS Access Engine 2016中的错误。我希望有人可以帮助我不要使用这种疯狂的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.