您的位置:首页 > 数据库 > Oracle

oracle 12C 使用问题二:

2013-11-25 09:50 459 查看
环境:操作系统win7 64位,数据库ORACLE 12C,为了使用plsql,使用32位ORACLE客户端instantclient-basic-nt-12.1.0.1.0

我的代码是使用System.Data.OracleClient连接Oracle数据库。

在webserver中测试连接数据库提示信息如下:

System.InvalidOperationException: 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ---> System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
在 System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
在 System.Data.OracleClient.OCI.DetermineClientVersion()

WCF提示一样,如下:

尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

从网上找了一下解决方法,基本上包括以下几种方式:

1、将使用“应用程序池”的:高级设置→启动32位应用程序,属性设置为true,即在64位系统下按照32位运行程序;

2、将解决方案,保存的时候,生成目标平台,指定为X86,即32位;

3、下载安装64位ORACLE客户端,并在环境变量的path中指定64位下指定oci.dll的位置。

这三种方法我都尝试过,错误依旧……

后来经过多次尝试,发现问题所在了。我的代码是使用System.Data.OracleClient连接Oracle数据库,而System.Data.OracleClient连接的时候要找ORACLE的oci.dll路径。

我安装ORACLE 12C的时候,自动在环境变量的path中写入了oci.dll的路径,我的安装路径为D:\app\oracleman\product\12.1.0\dbhome_3,而在path中自动写入的路径为D:\app\oracleman\product\12.1.0\dbhome_3\BIN。

在使用ORACLE 12C 32位客户端的时候,手动添加了32位的oci.dll路径,我ORACLE 12C 32位客户端的路径为D:\app\oracleman\product,手动在path中添加的路径为D:\app\oracleman\product\instantclient_12_1。

这样的情况下,64位和32位的oci.dll路径在path中都有,而我现在想在64位的操作系统下运行32位的程序,程序一直找到的是64位的oci.dll。

为什么只使用64位而忽略32位的oci.dll,这个原因也不清楚,我起初的解决办法是:

删除path中的64位oci.dll的路径,只保留32位的(注意,修改path一定要重启电脑)……

虽然这么修改后,为题的确解决了,但是后来经过多次尝试,才发现问题所在……

ORACLE 12C 32位客户端的路径为D:\app\oracleman\product\instantclient_12_1,而instantclient_12_1文件夹默认没有Authenticated User的访问权限。

因此在给32位客户端文件夹添加Authenticated User的“读取和执行”权限后,尽管path中同时包含64位和32位的oci.dll路径,,程序也可以找到32位的oci.dll,正常运行……

结论:环境参数中path配置后,还得注意相应的文件夹是否还受用户权限限制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: