zoukankan      html  css  js  c++  java
  • oracle odp.net 32位/64位版本的问题

    如果你的机器上安装了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
    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位
    注:在资源管理器里,只能看到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();
                }
    
                Console.Read();
            }
        }
    }
    
    总之一句话:要跑64位的.Net程序,就必须用64位的odp.net,要跑32位的.Net程序,就必须用32位的odp.net,且machine.config中要有相应的provider节点。
    最后给出odp.net32位与64位的下载地址:
    64位下载地址
    32位下载地址
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/2020793.html
Copyright © 2011-2022 走看看