使用 OleDb 的 MS Access 中的内部 OLE 自动化错误
Internal OLE Automation error in MS Access using OleDb
我正在尝试使用 OleDb 从 ASP MVC 应用程序访问 MS Access 数据库。我在连接字符串中使用的提供程序是 Microsoft.ACE.OLEDB.12.0.
当我从 Visual Studio 启动应用程序时,一切正常(我的计算机中安装了 Access)。我已经在 Windows Server 2012 (IIS 8) 上发布了 WebApp,在机器上安装了 Access Database Engine 64 位,一切也都按预期工作。
但现在我需要在 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
奇怪的是,如果我尝试更新(或插入)table,我更新任何类型的字段(文本、数字、日期)都没有问题,只要 WHERE 子句UPDATE 语句不包括文本类型以外的任何字段。
我也试过了
SELECT * FROM MYTABLE WHERE Str(NUMBERFIELD) = "666"
然后整个应用程序池崩溃,再次自动启动并崩溃! (事件日志显示 "A process serving application pool 'MyAppPool' suffered a fatal communication error with the Windows Process Activation Service. The process id was '12220'. The data field contains the error number.",事件 ID 为 5011)。
如果我使用 "SELECT Str(2) AS StrField FROM SOMETABLE" 之类的东西创建一个访问查询并将其命名为 MYACCESSQUERY,然后我仅使用一个简单的 "SELECT * FROM MYACCESSQUERY" 从我的应用程序查询该访问查询,AppPool 也会崩溃!。
在许多地方进行大量搜索后,Internal OLE Automation 错误与参数的使用有关,但我的情况似乎并非如此:毕竟,表达式最左边的部分是什么给我带来麻烦(NUMBERFIELD = 666 中的字段部分),而不是最右边的部分(我正在测试的值 666,通常是使用参数传递的部分)。
我试过构造带参数或不带参数的查询都无济于事,我比较了不同机器的应用程序池,它们看起来一样,我安装的 Access 数据库引擎也是一样的。
我尝试的一切都在我的开发机器和测试服务器上完美运行,但是当我尝试在客户端服务器上 运行 它时,什么都没有,我总是得到一个 "Internal OLE Automation error" 除非我只查询文本类型的字段(或者更糟的是,我崩溃了整个应用程序池)。
请帮忙,我运行想不出可以解释这种奇怪行为的想法。
以防有人遇到同样的情况。
虽然在任何地方都没有说明它是必要的(甚至是相关的),但安装 https://www.microsoft.com/en-us/download/confirmation.aspx?id=50040 上的 Microsoft Access 2016 Runtime 解决了这个问题(并且也提高了对数据库的访问速度)。
我还在摸不着头脑,为什么。
我正在尝试使用 OleDb 从 ASP MVC 应用程序访问 MS Access 数据库。我在连接字符串中使用的提供程序是 Microsoft.ACE.OLEDB.12.0.
当我从 Visual Studio 启动应用程序时,一切正常(我的计算机中安装了 Access)。我已经在 Windows Server 2012 (IIS 8) 上发布了 WebApp,在机器上安装了 Access Database Engine 64 位,一切也都按预期工作。
但现在我需要在 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
奇怪的是,如果我尝试更新(或插入)table,我更新任何类型的字段(文本、数字、日期)都没有问题,只要 WHERE 子句UPDATE 语句不包括文本类型以外的任何字段。
我也试过了
SELECT * FROM MYTABLE WHERE Str(NUMBERFIELD) = "666"
然后整个应用程序池崩溃,再次自动启动并崩溃! (事件日志显示 "A process serving application pool 'MyAppPool' suffered a fatal communication error with the Windows Process Activation Service. The process id was '12220'. The data field contains the error number.",事件 ID 为 5011)。
如果我使用 "SELECT Str(2) AS StrField FROM SOMETABLE" 之类的东西创建一个访问查询并将其命名为 MYACCESSQUERY,然后我仅使用一个简单的 "SELECT * FROM MYACCESSQUERY" 从我的应用程序查询该访问查询,AppPool 也会崩溃!。
在许多地方进行大量搜索后,Internal OLE Automation 错误与参数的使用有关,但我的情况似乎并非如此:毕竟,表达式最左边的部分是什么给我带来麻烦(NUMBERFIELD = 666 中的字段部分),而不是最右边的部分(我正在测试的值 666,通常是使用参数传递的部分)。
我试过构造带参数或不带参数的查询都无济于事,我比较了不同机器的应用程序池,它们看起来一样,我安装的 Access 数据库引擎也是一样的。
我尝试的一切都在我的开发机器和测试服务器上完美运行,但是当我尝试在客户端服务器上 运行 它时,什么都没有,我总是得到一个 "Internal OLE Automation error" 除非我只查询文本类型的字段(或者更糟的是,我崩溃了整个应用程序池)。
请帮忙,我运行想不出可以解释这种奇怪行为的想法。
以防有人遇到同样的情况。
虽然在任何地方都没有说明它是必要的(甚至是相关的),但安装 https://www.microsoft.com/en-us/download/confirmation.aspx?id=50040 上的 Microsoft Access 2016 Runtime 解决了这个问题(并且也提高了对数据库的访问速度)。
我还在摸不着头脑,为什么。