使用OleDb在MS Access中的内部OLE自动化错误

问题描述 投票:0回答:1

我试图使用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子句中包含的内容。

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

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(或INSERT)表,我在更新任何类型的字段(文本,数字,日期)时都没有问题,因为UPDATE语句的WHERE子句不包含任何字段字段以外的字段。

我也试过了

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自动化错误”,除非我只查询文本类型字段(或者更糟糕的是,我崩溃整个应用程序池)。

请帮忙,我的想法已经用完,可以解释这种奇怪的行为。

asp.net ms-access oledb
1个回答
0
投票

以防有人处于相同的情况。

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

我仍在摸不着头脑。

© www.soinside.com 2019 - 2024. All rights reserved.