.NET应用读Excel报MDAC错误 回收IIS应用池后快速复现求解决方案
报错信息中文翻译
- .Net Framework 数据提供程序需要 Microsoft 数据访问组件(MDAC)。请安装 2.6 或更高版本的 Microsoft 数据访问组件(MDAC)
- 检索 CLSID 为
{2206CDB2-19C1-11D1-89E0-00C04FD7A829}的 COM 类工厂失败,错误如下:800703fa尝试对已标记为删除的注册表项执行非法操作。(异常来自 HRESULT: 0x800703FA)
根因说明
第二个报错是核心触发源:IIS应用池运行过程中,Access Database Engine对应的COM组件注册表项被系统标记为删除,导致后续所有调用失败。回收应用池会重置进程上下文,临时清除失效的注册表引用,所以能短暂恢复正常。
修复方案
- 调整IIS应用池配置:打开IIS管理器,找到对应应用池,右键选择「高级设置」,找到「加载用户配置文件」选项,设置为
True。该配置会为应用池标识创建独立的注册表上下文,避免进程回收时注册表项被意外标记删除。 - 修正Excel读取代码的资源释放逻辑:现有代码大概率存在COM对象未正常释放的问题,每读取一次Excel就会残留泄漏的COM引用,积累到阈值就会触发注册表项异常。所有Excel相关的COM对象(包括Workbook、Worksheet、Application实例)都需要按创建顺序反向释放,调用
Marshal.ReleaseComObject()后手动置为null,最后主动触发GC回收。 - 调整应用池回收规则:如果业务峰值读取Excel的频率很高,可以把应用池的定期回收时间调整到业务低峰期,同时开启「禁止回收正在运行的工作进程」选项,避免正在处理Excel读取请求时进程被强制回收触发注册表标记删除。
- 校验权限与组件位数:确认应用池运行身份对
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet以及对应Access Database Engine的注册表路径有读取权限;同时保证IIS应用池的「启用32位应用程序」配置和安装的Access Database Engine位数完全一致,要么全32位,要么全64位,避免混合位数调用触发的COM加载异常。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

