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

    本文转自: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>
          <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中类似下面这样:
    1
    2
    3
    <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:appx86Microsoft Visual Studio 10.0VC>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:Windowsassembly 目录下也能看到x86与AMD64位
    注:在资源管理器里,只能看到2.112.2.0的x86/AMD64版本,看不到4.112.2.0版本的任何东东(不知道是不是我的个别现象,也有可能另外的版本在其它地方,我没找到)
    如果缺少相关的版本,可以先到oracle官网download,下面以64位odp.net为例:
    1、下载完成后,将其解压到某个目录,比如E:softwareoracle11gODP.Net,然后键入以下命令: E:softwareoracle11gODP.Netx64>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的区别。
    贴一段示例代码:
    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
    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 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    JAVA日报
    JAVA日报
    论文爬取(七)
    论文爬取(六)
    论文爬取(五)
    JAVA日报
    JAVA日报
    剑指 Offer 68
    剑指 Offer 68
    剑指 Offer 67. 把字符串转换成整数
  • 原文地址:https://www.cnblogs.com/freeliver54/p/3152422.html
Copyright © 2011-2022 走看看