几年前,我写了一个C#.NET程序,它使用Microsoft ACE和JET OLEDB将Excel电子表格转换为CSV文件。最近我们升级到Windows Server 2008 x64服务器。由于JET已被弃用,因此该方法不再有效。最初使用JET处理来自Excel 2003的.xls文件,并使用ACE处理.xlsx Excel 2007文件。我更改了连接字符串以使用ACE。
我们现在可以通过命令提示符成功运行程序。但是,当我们使用自动化软件(显然运行类似于Start-> Run方法的程序)时,我们会收到一条错误消息,指出未安装Microsoft数据访问组件。研究这些后,它们似乎只适用于32位系统,并且不支持Windows Server 2000以上的任何内容。
有什么想法吗?我们安装了最新的beta x64 ACE OLEDB驱动程序。该程序手动运行良好。我也尝试用x86的目标平台编译程序。我们还使用自动化软件使用的Windows帐户成功手动运行程序。
答案 0 :(得分:1)
在64位Windows上,该过程定义位数:32或64。
如果以64位模式启动程序,并且该程序执行COM(OLEDB是基于COM的),它将只查找COM 64位DLL(实际上,它只使用64位端)注册表注册了64位COM组件。)
如果以32位模式启动程序,并且该程序执行COM,它将仅查找COM 32位DLL。
现在,它可以依赖于C#编译器的版本,但是今天,大多数C#程序被配置为编译为“Any Cpu”。这意味着它们将在32位操作系统上运行为32,在64位操作系统上运行64,如果它们直接或间接使用COM(有时候,您甚至不知道您正在使用COM!),这会使事情变得非常复杂。
所以...总结一下:
1)确定进程的位数(使用任务管理器很容易,64位计算机上的32位进程后缀为“* 32”)。
2)安装相应的COM OLEDB驱动程序。
如果OLEDB驱动程序在64位模式下不存在,那么您将不得不重新编译C#.EXE或对其进行修补以强制使用32位模式。您可以使用CORFLAGS工具。