如何在64位win7下通过ODAC来访问Oracle服务器(转http://archive.cnblogs.com/a/2219400/)

Coordinator
Nov 24, 2011 at 8:29 AM
作者:永远的阿哲  来源:博客园  发布时间:2011-10-20 21:03  阅读:65 次  原文链接   [收藏]  

      最近公司跟我换了新电脑:2代i3+8G内存,由于32位的win7最多只能用3.25G内存,而用ramdisk4g划出4.75G来作硬盘又觉太浪费,遂想用64位的系统.

      从网上下载了冷风的64位win7后先装系统再装驱动再装常软件,除部份驱动需重新安装外,一路安好.但是在安装ODAC组件时,出了如下问题:

      1.常用的plsql与sqldbx只有32位版本,只能使用32位的ODAC,

      2.在64位系统上,如果使用32位的ODAC,asp.net程序时会报异常:尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题。

      3.32位的ODAC安装时无法向注册表写入必要信息,分布式服务Oracle Services for MTS无法安装.

      后来在网上疯狂搜索,发现出了这个问题的人还不少,其实,Oracle的客户端版本与服务端版本没有必然限制,32/64位的客户端访问32/64位的服务器没有任何问题,32位的客户/服务端装在32位的操作系统上,32/64位的客户/服务端装在64位的操作系统上也没有任何问题,主要是这些客户端与其它程序的兼容性问题.看来64位的系统想普及,还需时日啊.

      当然,解决的方法也是有的,主要思路就是不管32/64位的ODAC都一并装上去,然后plsql与sqldbx通过32位的ODAC来访问数据库,asp.net程序通过64位的ODAC来访问数据库/使用分布式事务.

      首先,安装64位的ODAC(install.bat oramts).由于操作系统也是64位的,这样就只需按照常规方式,在环境变量(Path)里加上其目录与其bin目录的路径,然后去注册表里修改语言设置(NLS_LANG),再加上监听文件路径(TNS_ADMIN),asp.net程序就可以通过64位的ODAC来访问数据库/使用分布式事务了.

      然后,安装32位的ODAC(install.bat basic).由于操作系统是64位的,无法操作注册表,这样安装后无法在注册表里写入必要数据,使用时也无法从中读取必要设置.这样相关的设置就只能通过环境变量来读取.还是在环境变量(Path)里加上其目录与其bin目录的路径,然后在环境变量里加上语言设置(NLS_LANG)与监听文件路径(TNS_ADMIN),然后在plsql与sqldbx的程序设置里,将oci文件路径强制指定为32位的ODAC路径,这样程序就可以正常使用了.

      这里有几点需要说明:

      1.如上所述,在Path里既有32位ODAC的路径又有64位ODAC的路径,这样相关程序会不会读取错误呢?结论是不会,32位的plsql与sqldbx会跳过64位的oci去调用32位的oci,而64位的asp.net程序则会跳过32位的oci去调用64位的oci.这样大家互不冲突

      2.32位的程序与64位的程序可以共同指向同一个监听目录,使用同一个监听文件.

      3.环境变量的更改与生效之间有时间差,可以不到1秒,也可能几分钟,所以最可靠的方式是重启.

 

      补:现在我发现了一种更简单的方式:对于64位系统上的64位的IIS,如果是IIS6,则通过命令行注册,将iis的64位模式改为32位模式,如果是IIS7,则通过应用程序池的高级设置,将"启用32位应用程序"设置为True,即可只用单独安装32位的ODAC.不过对于需要使用Oracle分布式事务的,则还是需要安装64位的ODAC,因为32位的ODAC中的分布式事务无法在64位系统中安装.

Coordinator
Nov 24, 2011 at 10:07 AM
 
使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题

作者:未知 时间: 2011-3-5 23:59:09 文档类型:未知 来自:未知 浏览统计:2135

DataAnnotation脱离MVC独立验证 vs2008 快捷键F7(查看代码) 不能用的解决办法

平时我们开发使用的是32位的PC机,所以安装的也是Oracle32位的客户端。但是一般服务器都是64位的,安装的也是64位的Oracle客户端,如果要部署使用Oracle.DataAccess连接Oracle的应用程序时,可能会遇到版本上的问题。

主要版本问题有两种,一种是32位版和64位版的问题,如果我们开发出来的应用是32位的,那么就必须使用32位的客户端,如果是64位的应用程序当然对应64位的客户端。这里需要注意:在64位的环境中使用VS开发Web程序,其运行的Web服务“WebDev.WebServer.exe”是32位的,所以如果要调试64位的Oracle连接程序,最好是部署到IIS中,使用IIS来连接Oracle数据库。

另一个版本问题是Oracle.DataAccess的版本号问题,我的本机就是32位的XP,安装了Oracle11gR2客户端后,在安装目录下的ODP.NET\bin\2.x目录中可以找到Oracle.DataAccess.dll文件,可以看到其版本号是:2.112.1.2。所以我开发出来的程序,引用的也是这个版本的库。

image

但是在64位下的Oracle.DataAccess.dll却不一样,安装后的版本是2.112.1.0,如图是Windows2008X64上的Oracle.DataAccess.dll。

image

现在把开发环境的程序发布部署到服务器上,就会抛出异常

未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项。

或者是

Could not load file or assembly 'Oracle.DataAccess, Version=2.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format之类的话。

总之就是找不到对应的程序集。显然,这里系统找的是2.112.1.2版本的Oracle.DataAccess,而服务器上只有2.112.1.0版本的,所以才报错,解决办法就是在web.config中修改,在configSections节点结束之后增加如下内容:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
        <dependentAssembly> 
            <assemblyIdentity name="Oracle.DataAccess" 
            publicKeyToken="89B483F429C47342" 
            culture="neutral" /> 
            <bindingRedirect 
              oldVersion="2.112.1.2" 
              newVersion="2.112.1.0"/> 
        </dependentAssembly> 
    </assemblyBinding> 
</runtime>

这样就可以让IIS调用2.112.1.0的Oracle.DataAccess了。添加这个配置后便可正常运行。
Coordinator
Nov 24, 2011 at 10:08 AM

Instant Client Downloads


Please note that Instant Client is provided under a separate OTN Development and Distribution License for Instant Client that allows most licensees to download, redistribute, and deploy in production environments, without charge.  Please consult the license and your legal department for clarification, if necessary.  For more information on Instant Client, see the official Instant Client site.

 
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

Coordinator
Nov 24, 2011 at 11:21 AM

用Instant Client,不安装oracle客户端使用sqlplus连接远程数据库


一、软件下载及环境配置
1.软件下载
http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html下载如下三个包:
instantclient-basic-win32-10.2.0.4.zip
instantclient-jdbc-win32-10.2.0.4.zip
instantclient-sqlplus-win32-10.2.0.4.zip
将这三个包分别解压,然后内容放到C:\instantclient_10_2下

然后从一台安装了oem的机器上复制%ORACLE_HOME\network\admin\tnsnames.ora也放到C:\instantclient_10_2中

http://www.anysql.net/software/ociuldr.zip下载coiuldr.zip,解压后里面有windows,linux,
solaris三个版本,将ociuldr.exe 复制到C:\instantclient_10_2,其中ociuldr.exe 是一个文本导出工具,具体参数可以参考http://www.anysql.net/ociuldr.html介绍

Coordinator
Nov 25, 2011 at 5:55 AM

InstantClient安装使用


因oracle应用程序及其工具toad、PLSQL Developer等的部署很多,动辙要安装几百兆的Oracle Client实在很烦。
Instant client小而够用。这里共享出自己的经验,供同行参考,如果能给你帮助,荣幸之至。

运行环境:windows XP sp3,新安装系统,从未安装过任何版本Oracle

1、下载Instant Client
http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
下载:
instantclient-basic-win32-11.1.0.7.0.zip
instantclient-sqlplus-win32-11.1.0.7.0.zip

这两个文件,看名字就知道意思了,如果你只用客户端工具,不使用命令行下sqlplus,第二个包可以不用

2、解压缩包到C:\instantclient_11_1
3、设置变量:
NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK(注意中间有空格,这个如果不设,toad查询中文会是乱码)
TNS_ADMIN=C:\instantclient_11_1
Path=C:\instantclient_11_1

4、保存以下内容为注册表文件,导入注册表(路径部分,请自己修改)

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1]
"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
"ORACLE_BUNDLE_NAME"="Enterprise"
"ORACLE_GROUP_NAME"="Oracle - OraClient10g_home1"
"ORACLE_HOME"="c:\\instantclient_11_1"
"ORACLE_HOME_KEY"="SOFTWARE\\ORACLE\\KEY_OraClient10g_home1"
"ORACLE_HOME_NAME"="OraClient10g_home1"

5、建立tnsnames.ora,并保存到安装目录:C:\instantclient_11_1

这个这里就不多说了

# tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\client_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)


6、测试:
C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 7月 9 15:11:16 2009

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

SQL> conn scott/tiger@orcl
已连接。
SQL>

至此,安装已经完成。toad、PLSQL Developer等工具,以及应用软件都可以正常使用了。

Coordinator
Nov 26, 2011 at 12:52 AM

未能加载文件或程序集“Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项。试图加载格式不正确的程序


对于64位的操作系统:Oracle.DataAccess.dll iis的应用程序池的高级选项
 

 

这里要设置为true,上面的是32位的数据库,上次的出错,就是这个解决。但是当数据库为64位的时候:Oracle.DataAccess.dll,要换成当前数据库的这个文件,同时把那个地方设置为false



最近在做ASP.Net开发中使用Oracle,其中用到了Oracle提供的数据库提供程序ODP.NET,具体用到了Oracle.DataAccess.dll这个组件。在实践中,碰到过几次都出现“未能加载文件或程序集”Oracle.DataAccess, Version=2.112.1.0 …””,如上图所示。在此,问题和解决方法总结如下:

1. 问题出现的可能原因

(1)引用出错:无法加载时,可能是Oracle.DataAccess.dll引用的路径不正确;

(2)版本不匹配:在开发中引用的Oracle.DataAccess.dll与Oracle中的版本不匹配。所谓版本不匹配,一方面是指版本号不匹配;另一方面是64位和32位不匹配,使用64位的Oracle时一定要使用相应64位的Oracle.DataAccess.dll。

2. 解决办法

(1)检查引用是否出错时很简单,就看引用路径中是否存在Oracle.DataAccess.dll这个文件;

(2)Oracle.DataAccess.dll 一般位于Oracle安装目录 “..\product\11.2.0\dbhome_1\ODP.NET\bin\2.x\”中,在开发时使用与程序中连接Oracle对应的Dll即可。