我在使用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位)
-
Perl 5.12.3 v5(也是32位)
-
我有我的Perl CGI脚本来调用我的C#程序(它是为"任何CPU"构建的)。
-
C#程序使用MDAC打开和读取Excel文件(不尝试启动Excel,只尝试从Excel文件中读取数据)。
我已经验证了服务器在以下两个文件夹中有可用的最新MDAC:
C:Program FilesCommon FilesSystemOle DB
C:Program Files (x86)Common FilesSystemOle DB
我还检查了注册表,它们看起来很好。无论如何,我在命令提示符下直接运行C#程序没有任何问题(它可以使用MDAC访问Excel文件)。只有当我使用Apache/Perl使用我的PerlCGI脚本来调用我的C#程序时(也就是说,当我在MDAC中遇到错误时),我才会遇到问题。
我可以通过在我的Perl CGI脚本中指定CommonProgramFiles(x86)来解决这个问题,如下所示:
$ENV{ "CommonProgramFiles(x86)" } = "C:\Program Files (x86)\Common Files";
我有一个问题:
- 为什么我有这个问题?为什么设置CommonProgramFiles(x86)系统环境变量可以解决这个问题?为什么在我设置系统环境变量之前它是空的?这是否与我在64位的Windows操作系统中运行32位Apache/Perl有关
请帮助我理解这个问题。提前谢谢。
(这篇文章的原始版本有一个关于第二个问题的问题。原来这个问题与字符串中多了一个双引号有关。我解决了这个问题,这个问题已经消失了。这就是为什么我从帖子中删除了第二个问题)
周
我做了更多的研究,问题如下:在2.4.9版本之前,Apache启动例程已经映射了"公共程序文件(x86)";至";公共程序文件_x86_;除非你创建它,否则该变量在环境中不存在……我还没有测试过它,但创建该环境变量并使其指向与公共程序文件(x86)相同的位置可能也会解决这个问题。
由于编译后的Apache发行版只使用2.4.46版本,因此它们没有允许在环境变量中使用括号的修复程序。这就是为什么您仍然需要PassEnv指令来确保Apache将正确的值传递给32位CGI脚本。
以下帖子提供了一些有用的详细信息:https://bz.apache.org/bugzilla/show_bug.cgi?id=46751
我曾经在Apache 2.4中遇到过同样的问题,dBase编译的应用程序使用ADO-32位,因为dBase是32位的。最近发生了一些变化,可能是Windows 10 2004 20H2。我在2020年7-8月需要这个修复程序,但现在我没有,环境变量已经存在。由于我的Apache版本日期为2020年4月,所以这不能成为更改的原因。
我试图对此进行一些研究,但我所能发现的是,这些环境变量是至少自2017年以来存在的系统变量,所以我为什么需要设置这个var对我来说是个谜,但我想了解这一点,所以如果你发现了什么,请发布后续。。。
https://learn.microsoft.com/en-us/windows/deployment/usmt/usmt-recognized-environment-variables