[轉]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:\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的區別。
貼一段示例代碼:
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 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM