Apache/Perl无法找到没有CommonProgramFiles(x86)的MDAC

Apache/Perl无法找到没有CommonProgramFiles(x86)的MDAC,apache,perl,environment-variables,mdac,Apache,Perl,Environment Variables,Mdac,我在使用Apache/Perl使用Microsoft数据访问组件(MDAC)访问Excel文件时遇到问题。不知何故,我必须设置“CommonProgramFiles(x86)”系统环境变量才能使其正常工作。否则,我会不断收到以下错误消息: System.InvalidOperationException:.Net Framework数据提供程序 需要Microsoft数据访问组件(MDAC)。请安装 Microsoft数据访问组件(MDAC)2.6版或更高版本。--> System.IO.Fil

我在使用Apache/Perl使用Microsoft数据访问组件(MDAC)访问Excel文件时遇到问题。不知何故,我必须设置“CommonProgramFiles(x86)”系统环境变量才能使其正常工作。否则,我会不断收到以下错误消息:

System.InvalidOperationException:.Net Framework数据提供程序 需要Microsoft数据访问组件(MDAC)。请安装 Microsoft数据访问组件(MDAC)2.6版或更高版本。--> System.IO.FileNotFoundException:检索的COM类工厂 由于以下原因,CLSID为{2206CDB2-19C1-11D1-89E0-00C04FD7A829}的组件失败 导致以下错误:8007007e

服务器配置为:

  • 64位Windows Server 2008 R2

  • 服务器已安装Microsoft Access数据库引擎2010

  • Apache 2.2.25(即32位)

  • Perl5.12.3V5(也是32位的)

  • 我有我的Perl CGI脚本来调用我的C#程序(它是为“任何CPU”构建的)

  • C#程序使用MDAC打开和读取Excel文件(不尝试启动Excel,只尝试从Excel文件中读取数据)

我已验证服务器在以下两个文件夹中具有最新的MDAC:

C:\Program Files\Common Files\System\Ole DB
C:\Program Files (x86)\Common Files\System\Ole DB
我还检查了登记处,它们看起来很好。无论如何,直接在命令提示符下运行C#程序没有任何问题(它可以使用MDAC访问Excel文件)。我只有在使用Apache/Perl使用Perl CGI脚本调用我的C#程序时才会遇到问题(也就是当我在MDAC中遇到错误时)

我可以通过在Perl CGI脚本中指定CommonProgramFiles(x86)来解决这个问题,如下所示:

$ENV{ "CommonProgramFiles(x86)" } = "C:\\Program Files (x86)\\Common Files";
我有一个问题:

  • 为什么我会有这个问题?为什么设置CommonProgramFiles(x86)系统环境变量可以解决这个问题?为什么在我设置系统环境变量之前它是空的?这是否与我在64位Windows操作系统中运行32位Apache/Perl有关
请帮助我理解这个问题。提前谢谢

(这篇文章的原始版本有一个关于第二个问题的问题。结果发现,这个问题与字符串中额外的双引号有关。我解决了这个问题,这个问题已经消失了。这就是我从文章中删除第二个问题的原因)


Jay Chan

我曾经在Apache 2.4中遇到过同样的问题,数据库编译的应用程序使用ADO-32位,因为数据库是32位的。最近发生了一些变化,可能是Windows 10 2004 20H2。我在2020年7月至8月需要此修复,但现在我没有,环境变量已经存在。因为我的Apache版本日期是2020年4月,所以这不能成为更改的原因

我试图对此做一些研究,但我能发现的是,这些环境变量是至少自2017年以来就存在的系统变量,所以我为什么需要设置此var对我来说是个谜,但我想了解这一点,所以如果你发现了什么,请发布后续信息


我做了更多的研究,问题如下:在2.4.9版之前,Apache启动例程已将“commonprogramfiles(x86)”映射到“commonprogramfiles\u x86\u”,并且该变量在环境中不存在,除非您创建它。。。我还没有测试过它,但是创建该环境变量并使其指向与commonprogramfiles(x86)相同的位置可能也会解决这个问题

由于编译后的Apache发行版只使用了我们所说的2.4.46版本,因此它们没有允许在环境变量中使用括号的修复程序。这就是为什么您仍然需要PassEnv指令来确保Apache将正确的值传递给32位CGI脚本

下面的帖子提供了一些有用的细节: