分享

32位Oracle在64位Windows7下,C#调用错误解决

 bao911 2014-08-01

  64位Windows 7旗舰版下安装了32位的Oracle,在C#的Form Window程序中执行数据库打开语句的时候出现报错:Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.

  MSDN给出的BadImageFormatException信息是:当动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常。意思是说在64位下面用了32位的OracleClient,也就是我现在的这种情况。

  由于System.Data.OracleClient所指向的是PATH环境变量下的oci.dll,所以我们只要让程序能够找到64位的oci.dll就可以了。方法如下:

  1. 下载instantclient-basic-win32-11.2.0.1.0.zip,并解压,如C:\instantclient_11_2
  2. 在系统的环境变量PATH中加入以上路径,可以放在环境变量的最后。
  3. 重启操作系统。程序会依照PATH路径寻找oci.dll,如果遇到32位的oci.dll会自动略过,找到64位的oci.dll就能连接上数据库了。

  注意:32位Oracle在64位Windows 7的注册表中路径是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE,不是HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,所以在C#程序中最好不用oracle的tnsnames.ora,而是写在连接字符串里。如:

            string host = "127.0.0.1";
            int port = 1521;
            string serviceName = cmbDataSource.Text;
            string dataSource = string.Format("(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1}))) (CONNECT_DATA = (SERVICE_NAME = {2})))", host, port, serviceName);
            string ConnectionString = string.Format("User ID={0};Password={1};Data Source={2};Unicode=True",
                                                    tbUserId.Text,
                                                    tbPassword.Text,
                                                    dataSource);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多