【问题标题】:Internal OLE Automation error in MS Access using OleDb使用 OleDb 的 MS Access 中的内部 OLE 自动化错误
【发布时间】:2026-01-01 03:40:02
【问题描述】:

我正在尝试使用 OleDb 从 ASP MVC 应用程序访问 MS Access 数据库。我在连接字符串中使用的提供程序是 Microsoft.ACE.OLEDB.12.0。

当我从 Visual Studio 启动应用程序时,一切正常(Access 已安装在我的计算机中)。我已经在 Windows Server 2012 (IIS 8) 上发布了 WebApp,在机器上安装了 64 位 Access 数据库引擎,一切都按预期工作。

但现在我需要在 Windows Server 2008 (IIS 7.5) 上安装应用程序。根据我在查询的 WHERE 子句中包含的内容,我会在该机器上得到最奇怪的行为。

如果我查询任何文本类型的字段,则没有问题。例如,这没关系:

SELECT * FROM MYTABLE WHERE TEXTFIELD = "SOMETHING"

但如果我查询,比如说,一个数字字段:

SELECT * FROM MYTABLE WHERE NUMBERFIELD = 666

我总是得到一个

System.Data.OleDb.OleDbException (0x80040E14): Internal OLE Automation error

我什至无法查询

SELECT * FROM MYTABLE WHERE 666 = 666

奇怪的是,如果我尝试更新(或插入)表,我在更新任何类型的字段(文本、数字、日期)时都没有问题,只要 UPDATE 语句的 WHERE 子句没有t 包括除 Text 类型以外的任何字段。

我也试过了

SELECT * FROM MYTABLE WHERE Str(NUMBERFIELD) = "666"

然后整个应用程序池崩溃,再次自动启动并崩溃! (事件日志显示“服务应用程序池 'MyAppPool' 的进程与 Windows 进程激活服务发生致命通信错误。进程 ID 为 '12220'。数据字段包含错误号。”,事件 ID 为 5011 )。

如果我使用“SELECT Str(2) AS StrField FROM SOMETABLE”之类的内容创建一个 Access Query 并将其命名为 MYACCESSQUERY,然后我只使用简单的“SELECT * FROM MYACCESSQUERY”从我的应用程序中针对该 Access Query 进行查询AppPool 也崩溃了!

在许多地方进行大量搜索后,内部 OLE 自动化错误与参数的使用有关,但我的情况似乎并非如此:毕竟,表达式的最左边部分是什么我的麻烦(NUMBERFIELD = 666中的字段部分),而不是最右边的部分(我正在测试的值666,通常是使用参数传递的部分)。

我尝试构建带或不带参数的查询都无济于事,我比较了不同机器的应用程序池,它们看起来一样,我安装的 Access 数据库引擎也是一样的。

我尝试的一切都在我的开发机器和测试服务器上完美运行,但是当我尝试在客户端服务器上运行它时,什么也没有,我总是得到一个“内部 OLE 自动化错误”,除非我只查询文本类型字段(或者更糟糕的是,我会崩溃整个应用程序池)。

请帮忙,我已经没有办法解释这种奇怪的行为了。

【问题讨论】:

  • 请注意,Access 数据库引擎明确不打算与 ASP.Net 一起使用,如详细信息下的 download page 中所述。 Access 数据库引擎旨在在普通用户帐户下运行,如果不是这种情况,可能会引发奇怪的错误。您可以尝试提供minimal reproducible example,但最好转向支持的技术(例如 SQL Server Express Edition)
  • 问题是,@Erik,我无法决定使用什么数据库。我们的客户正在使用 Access,Web 应用程序必须从该数据库中提取信息。顺便说一句,以管理员用户身份运行 AppPool 也不会改变任何事情。

标签: asp.net ms-access oledb


【解决方案1】:

以防万一有人遇到同样的情况。

虽然在任何地方都没有说明这是必要的(甚至是相关的),但安装在https://www.microsoft.com/en-us/download/confirmation.aspx?id=50040 上找到的 Microsoft Access 2016 运行时解决了问题(并且也提高了对数据库的访问速度)。

我还在摸不着头脑。

【讨论】: