You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的版本
  • 检查文件路径与权限
    别把数据库创建在系统保护的文件夹里(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:51:46