相关文章推荐
绅士的酱牛肉  ·  面向开发人员的 PL/SQL | ...·  1 月前    · 
开朗的枕头  ·  精通 Oracle+Python,第 3 ...·  1 月前    · 
鬼畜的椰子  ·  docker安装oracle并导入数据库-百度经验·  4 周前    · 
成熟的火柴  ·  標準 | Oracle 台灣·  1 周前    · 
酷酷的煎鸡蛋  ·  Oracle-动态性能视图解读开发者社区·  6 天前    · 
开心的足球  ·  老人乘公交车呕吐一地 ...·  5 月前    · 
八块腹肌的砖头  ·  郭穗彦:《欲经》:被误解的经典 _云南省社会科学院·  1 年前    · 
儒雅的枇杷  ·  不仅杉杉奥莱(实探主体完工) ...·  1 年前    · 
果断的甜瓜  ·  吸血鬼的恋爱契约在线,漫画评分 - 快看漫画·  2 年前    · 
帅呆的匕首  ·  2021年6月小鹏购车指南:P7后排空间可能 ...·  2 年前    · 
Code  ›  oracle odp.net 32位/64位版本的问题开发者社区
oracle
https://cloud.tencent.com/developer/article/1026100?areaId=106001
暗恋学妹的稀饭
2 年前
作者头像
菩提树下的杨过
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 菩提树下的杨过 > oracle odp.net 32位/64位版本的问题

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

作者头像
菩提树下的杨过
发布 于 2018-01-22 15:18:44
1.2K 0
发布 于 2018-01-22 15:18:44
举报

如果你的机器上安装了odp.net,且确信machine.config也有类似以下结节:(64位+.net 4.0环境下,machine.config可能会有4份,分别对应于.net2.0/4.0的32/64位版本,要每个都检查过去哦)

 <DbProviderFactories>
      <add name="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中类似下面这样:

<DbProviderFactories>
      <add name="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 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位

注:在资源管理器里,只能看到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的二个版本

注:在这个界面上,只能看到2.112.2.0与4.112.2.0二个版本号,体现不出x86/x64的区别。

贴一段示例代码:

using System;
using Oracle.DataAccess.Client;
namespace test
    class Program
        static void Main(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 = new OracleConnection(_connString))
                string sql = "select * from emp t where mgr=:mgr";
                OracleCommand cmd = new OracleCommand(sql, conn);
                conn.Open();
                cmd.Parameters.Add(new OracleParameter() { 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();
 
推荐文章
绅士的酱牛肉  ·  面向开发人员的 PL/SQL | Oracle 中国
1 月前
开朗的枕头  ·  精通 Oracle+Python,第 3 部分:数据解析
1 月前
鬼畜的椰子  ·  docker安装oracle并导入数据库-百度经验
4 周前
成熟的火柴  ·  標準 | Oracle 台灣
1 周前
酷酷的煎鸡蛋  ·  Oracle-动态性能视图解读开发者社区
6 天前
开心的足球  ·  老人乘公交车呕吐一地 12岁陌生女孩用书皮接住_新闻频道_中国青年网
5 月前
八块腹肌的砖头  ·  郭穗彦:《欲经》:被误解的经典 _云南省社会科学院
1 年前
儒雅的枇杷  ·  不仅杉杉奥莱(实探主体完工) 地铁3号线、中关村都来了 - 知乎
1 年前
果断的甜瓜  ·  吸血鬼的恋爱契约在线,漫画评分 - 快看漫画
2 年前
帅呆的匕首  ·  2021年6月小鹏购车指南:P7后排空间可能不如Model 3,G3基本不推荐购买 - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号