C# WPF调用Access 2016时OpenCurrentDatabase触发内存访问异常
解决C# WPF中Access 2016数据库自动创建时的AccessViolationException问题
嘿,我之前也踩过这个一模一样的坑!你遇到的这个内存访问异常,大概率是用错了Access Interop的核心方法,再加上一些COM调用的细节没处理到位。让我给你一步步拆解解决方案:
核心问题:用错了创建数据库的方法
你当前调用的OpenCurrentDatabase是用来打开已存在的Access数据库的,如果目标路径下没有对应文件,或者你的需求是创建新库,这个方法就会触发异常(而且因为COM Interop的特性,错误表现成了内存访问异常)。正确的做法是用NewCurrentDatabase方法来创建新数据库:try { var tempDb = new Access.Application(); // 用NewCurrentDatabase创建新库,指定2016格式 tempDb.NewCurrentDatabase(tempDbPathFile, Access.AcNewDatabaseFormat.acFormatAccess2016); // 这里可以加初始化操作,比如创建表、设置字段等 // 用完必须正确释放COM对象,避免内存泄漏 tempDb.Quit(Access.AcQuitOption.acQuitSaveAll); System.Runtime.InteropServices.Marshal.ReleaseComObject(tempDb); GC.Collect(); GC.WaitForPendingFinalizers(); } catch (Exception ex) { // 捕获并处理异常 Console.WriteLine($"创建数据库出错:{ex.Message}"); }确保引用正确的Interop版本
要确认你引用的是适配Access 2016的Interop库:- 如果通过NuGet安装,选择对应Office 2016版本的
Microsoft.Office.Interop.Access - 如果通过COM引用添加,要选「Microsoft Access 16.0 Object Library」,别选错成2010/2013的版本
- 如果通过NuGet安装,选择对应Office 2016版本的
检查文件路径与权限
别把数据库创建在系统保护的文件夹里(比如C:\Program Files、C:\Windows),这些路径需要管理员权限才能写入,Access Interop调用时容易因权限不足触发异常。建议放在用户可读写的路径,比如:string tempDbPathFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "NewAccessDb.accdb");务必正确释放COM对象
Office Interop的COM对象不会被.NET GC自动及时回收,如果不手动释放,不仅会导致内存泄漏,还可能引发后续的异常。所以用完Access.Application后,一定要调用Quit(),再通过Marshal.ReleaseComObject和GC相关方法彻底清理。
内容的提问来源于stack exchange,提问作者Rob Bowman
相关产品推荐
相关产品推荐

