使用OleDb

时间:2019-02-11 14:37:33

标签: asp.net ms-access oledb

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

当我从Visual Studio启动应用程序时,一切正常(在我的计算机上安装了Access)。我已经在Windows Server 2012(IIS 8)上发布了WebApp,并在计算机上安装了64位Access Database Engine,并且一切正常。

但是现在我需要在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(或INSERT)操作,那么更新任何类型的字段(文本,数字,日期)都没有问题,就像UPDATE语句的WHERE子句一样不能包含“文本”类型以外的任何其他字段。

我也尝试过

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

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

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

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

我试图构造带有或不带有参数的查询都无济于事,我比较了不同计算机的应用程序池,它们看起来相同,我安装的Access数据库引擎也相同。

我尝试的所有内容在开发机器和测试服务器中均能正常工作,但是当我尝试在客户端服务器上运行时,什么也没有,除非我仅针对Text进行查询,否则我总是会收到“内部OLE自动化错误”类型字段(或更糟糕的是,我使整个应用程序池崩溃了。)

请帮忙,我用尽了所有可以解释这种奇怪行为的想法。

1 个答案:

答案 0 :(得分:0)

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

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

为什么我仍在挠头。