【转】oracle odp.net 32位/64位版本的问题

摘要:
123如果您使用的是64位操作系统,开发工具是高级vs Net2010sp1,但代码无法连接到oracle,并且报告了一些奇怪的错误,例如“找不到DataProvider”、“oracle.DataAccess.Client无法加载”等等。他们不知所措,大声咆哮:“上帝,有树,有树!”祝贺大多数时候,您遇到了x64/x64版本的问题。在odp之后。net,默认情况下,Oracle程序集将部署在GAC中DataAccess,如果您安装x86版本,则是GAC中的x86;如果安装x64版本,则GAC为AMD64版本。粘贴示例代码:ViewCode?

参考资料:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html

如果你的机器上安装了odp.net,且确信machine.config也有类似以下结节:(64位+.net 4.0环境下,machine.config可能会有4份,分别对应于.net2.0/4.0的32/64位版本,要每个都检查过去哦)
<DbProviderFactories>
      <addname="Oracle Data Provider for .NET"invariant="Oracle.DataAccess.Client"description="Oracle Data Provider for .NET"type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</DbProviderFactories>
4.0的machine.config中类似下面这样:
1
2
3
<DbProviderFactories>
      <addname="Oracle Data Provider for .NET"invariant="Oracle.DataAccess.Client"description="Oracle Data Provider for .NET"type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
         </DbProviderFactories>
如果碰巧您又在用64位的操作系统(比如win2008 r2),开发工具又是最先进的vs.net 2010 sp1,但是死活在代码就是连接不上oracle,一直报一些奇怪的错误:比如“Data Provider找不到”啦,“Oracle.DataAccess.Client无法加载”啦之类,正在一筹莫展大声咆哮:“天理,有木有啊,有木有!”之时,恭喜你,多半是遇到了x64/x64的版本问题。(我今天花了近一上午的时间才弄明白问题所在)
odp.net安装后,默认会在GAC中部署程序集Oracle.DataAccess,如果你安装的是x86版本,GAC中的就是x86;如果你安装的x64版本,GAC中的就是AMD64版本。 
检测本机GAC中是否有Oracle.DataAccess程序集并查看版本的方法如下:
在vs.net命名行窗口下,输入gacutil.exe /l Oracle.DataAccess
如果看到类似下面的结果:
D:\app\x86\Microsoft Visual Studio 10.0\VC>gacutil.exe /l Oracle.DataAccess
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.
The Global Assembly Cache contains the following assemblies:
  Oracle.DataAccess, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
  Oracle.DataAccess, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86
  Oracle.DataAccess, Version=4.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
  Oracle.DataAccess, Version=4.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86
Number of items = 4

表明你的机器上安装了4个版本的Oracle.DataAccess,分别对应于.net 2.0以及.net 4.0的32位/64位版本
而且在C:\Windows\assembly 目录下也能看到x86与AMD64位
【转】oracle odp.net 32位/64位版本的问题第1张
注:在资源管理器里,只能看到2.112.2.0的x86/AMD64版本,看不到4.112.2.0版本的任何东东(不知道是不是我的个别现象,也有可能另外的版本在其它地方,我没找到)
如果缺少相关的版本,可以先到oracle官网download,下面以64位odp.net为例:
1、下载完成后,将其解压到某个目录,比如E:\software\oracle11g\ODP.Net,然后键入以下命令:
E:\software\oracle11g\ODP.Net\x64>install.bat all c:\odp.net myhome (install all components)
上述命令将自动把所有文件复制到c:\odp.net下
2、然后转到c:\odp.net下,键入命令:
c:\odp.net>configure.bat all myhome (configure all component)
将自动向GAC中部署相应的程序集.
然后在vs2010里,添加引用时,应该就能看到Oracle.DataAccess的二个版本
【转】oracle odp.net 32位/64位版本的问题第2张
注:在这个界面上,只能看到2.112.2.0与4.112.2.0二个版本号,体现不出x86/x64的区别。
贴一段示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
usingSystem;
usingOracle.DataAccess.Client;
  
namespacetest
{
    classProgram
    {
        staticvoidMain(string[] args)
        {
            //建议用这种风格的连接字符串,可以不用依赖于listener.ora文件中的配置
            string_connString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User Id=scott;Password=tiger;";
  
            using(OracleConnection conn = newOracleConnection(_connString))
            {
                stringsql = "select * from emp t where mgr=:mgr";
                OracleCommand cmd = newOracleCommand(sql, conn);
                conn.Open();
                cmd.Parameters.Add(newOracleParameter() { ParameterName="mgr",Value="7839"});
                OracleDataReader dr =  cmd.ExecuteReader();
                while(dr.Read())
                {
                    Console.WriteLine("empno:{0},ename:{1},mgr:{2}", dr["empno"], dr["ename"],dr["mgr"]);
                }
                dr.Close();
            }
  
            Console.Read();
        }
    }
}
总之一句话:要跑64位的.Net程序,就必须用64位的odp.net,要跑32位的.Net程序,就必须用32位的odp.net,且machine.config中要有相应的provider节点。
最后给出odp.net32位与64位的下载地址:
64位下载地址
32位下载地址
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

免责声明:文章转载自《【转】oracle odp.net 32位/64位版本的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一文带你了解微服务架构和设计(多图)rsync 开启用户密码认证下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于godror 的 oracle prometheus exporter

iamseth/oracledb_exporter 是一个挺不错的 oracle prometheus exporter ,但是因为oracle golang 驱动的问题,不是很方便 (构建,使用),所以基于godror/godror 调整了一个版本(很简单,替换一个依赖包就可以了),以下是参考说明 修改的文件 go.mod module github....

Oracle体系结构之联机日志文件管理

日志文件分类:重做日志文件 归档日志文件 警告日志文件 跟踪日志文件 redo_log_file文件作用: 1)维护数据一致性 2)记录了数据库里的更改操作 redo_log_friles以组为单位,一个组下可以有多个成员,顺序循环写,一个数据库要启动至少要有2个日志组,每个组下至少有一个成员,redolog以多工方式工作。 日志切换:从一个组切换到下一个...

Oracle 后台进程 详细说明

一. 进程概述 先来看一下Oracle 11g 的架构图。 看起来比较模糊,我已经上传到了csdn 的下载。 是个pdf 文件, 2m 多。 那个看起来比较清楚。 也对每个进程做了解释。 下载地址:Oracle 11g 架构图 from Oracle University http://download.csdn.net/source/2346700 进...

Oracle-数据泵使用

转至:https://www.cnblogs.com/chinas/p/8300955.html#_label0 阅读目录  一、为何选择数据泵方式 二、准备工作 1、目标新库上的操作 2、创建数据备份目录(源库和目标库) 三、导入导出 1、expdp导出 2、impdp导入 四、参数说明 1、expdb (1)关键字及其说明 (2)命令及...

Oracle 11g 数据类型

  Oracle 11g Datatypes VARCHAR2(size [BYTE | CHAR]) 可变长度的字符串的最大长度有大小字节或字符。最大尺寸是4000字节或字符,最低为1个字节或1个字符。您必须指定VARCHAR2大小。 字节表示该列将有字节长度语义。 CHAR列表示将字符语义。 NVARCHAR2(size) 可变长度的Unicode字符...

Oracle 死锁的检测查询及处理

来源于: http://www.cnblogs.com/hoojo/archive/2012/08/31/2665583.html -- 死锁查询语句 SELECT bs.username "Blocking User", bs.username "DB User", ws.username "Waiting User", bs...