zoukankan      html  css  js  c++  java
  • .net中使用ODP.net访问Oracle数据库(无客户端部署方法)

    https://blog.csdn.net/rrrrssss00/article/details/7178515/

     
    ------------------------------Oracle 11g ODAC 11.1.0.7.20 with Oracle Developer Tools for Visual Studio(ODTwithODAC1110720.zip)版本----------------------------------------------------

    ODP.net是Oracle提供的数据库访问类库,其功能和效率上都有所保证,它还有一个非常方便特性:在客户端上,可以不用安装Oracle客户端,直接拷贝即可使用。

    以下内容转载自:http://blog.ywxyn.com/index.php/archives/326

    由于微软在.net framework4中会将System.Data.OracleClient.dll deprecated,而且就访问效率和速度而言,System.Data.OracleClient.dll与Oracle.DataAccess.dll相比,微软的确实没有oracle提供的类库有优势,所以我放弃了使用多年的System.Data.OracleClient.dll,取而代之的是odp.net。然而odp.net的优点不止这些,还包括:

    1、不在安装客户端也能访问服务器上的oracle(假设Application Server与DB Server 分开)

    2、不需要配置TnsNames.Ora文件

    当然,我选择odp.net的最主要的原因还是性能。这篇文章列举了两者之间的对比。Technical Comparison: ODP.NET Versus Microsoft OracleClient

    下面我将介绍如何在一个在新的项目中使用odp.net。环境配置:A机器,运行C#程序,没有安装oracle数据库或者客户端等任何oracle的产品;B机器就运行着一个oracle9i数据库,再没安装过其它oracle产品

    官方下载地址(ODP.net)(中文):http://www.oracle.com/technetwork/cn/topics/dotnet/downloads/index.html

    首先要下载odp.net文件,可以在这个页面下载Oracle Data Access Components (ODAC) Downloads,我下载的是Oracle 11g ODAC 11.1.0.7.20 with Oracle Developer Tools for Visual Studio这个版本。

    下载完成之后不用安装,将Oracle.DataAccess.dll文件从 ODTwithODAC1110720.zipstageComponentsoracle.ntoledb.odp_net_211.1.0.7.101DataFilesfilegroup4.jar文件中解压出来就行,然后复制到项目中,再添加引用Oracle.DataAccess.dll。
    编写如下代码:

    using Oracle.DataAccess.Client;
    ...
    string connstring =
      "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1527))" +
      "(CONNECT_DATA=(SID=orcl)));User Id=sys;Password=sys;";//这个也可以放到Web.Config中。
    using (OracleConnection conn = new OracleConnection(connstring))
    {
      conn.Open();
      string sql = "select * from users";
      using (OracleCommand comm = new OracleCommand(sql, conn))
      {
        using (OracleDataReader rdr = comm.ExecuteReader())
        {
          while (rdr.Read())
          {
            Console.WriteLine(rdr.GetString(0));
          }
        }
      }
    }

    代码编写好以后,还要从下载的压缩包中取出几个dll文件。
    1、oci.dll (在jar文件里面叫’oci.dll.dbl’,拿出来之后去掉.dbl in ODTwithODAC1110720.zipstageComponents oracle.rdbms.rsf.ic11.1.0.7.01DataFilesfilegroup2.jar)
    2、oraociicus11.dll (in ODTwithODAC1110720.zipstageComponents oracle.rdbms.ic11.1.0.7.01DataFilesfilegroup3.jar)

    3、OraOps11w.dll (in ODTwithODAC1110720.zipstageComponents oracle.ntoledb.odp_net_211.1.0.7.101DataFilesfilegroup3.jar)

    4、oraons.dll (in ODTwithODAC1110720.zipstageComponents oracle.ons.ic11.1.0.7.101DataFilesfilegroup1.jar    ) 


    下面这三个有人说需要,有人说不需要,反正也不差这三个,继续吧:
    5、orannzsbb11.dll (in ODTwithODAC1110720.zipstageComponentsoracle.ldap.rsf.ic11.1.0.7.01DataFilesfilegroup1.jar)
    6、oraocci11.dll (in ODTwithODAC1110720.zipstageComponents oracle.rdbms.rsf.ic11.1.0.7.01DataFilesfilegroup3.jar)
    7、ociw32.dll (在jar文件里面叫’ociw32.dll.dbl’,拿出来之后去掉.dbl in ODTwithODAC1110720.zipstageComponents oracle.rdbms.rsf.ic11.1.0.7.01DataFilesfilegroup2.jar)
    最后把这个DLL复制到项目中,CS的要与exe一个文件夹,B/S的有专门的bin目录。

    当然,使用一项新技术,必然会遇到一些错误:以下是我遇到的:

    1、运行的时候遇到这个异常提示’The provider is not compatible with the version of Oracle client’,不要紧张,检查一下上面所用到的dll是否齐全就OK。

    2、“找不到请求的 .Net Framework 数据提供程序。可能没有安装。”这个错误提示是因为在machine.config中找不到Oracle.DataAccess.dll,将下面的代码放到

    <DbProviderFactories></DbProviderFactories&gt;

    之间就OK。

    <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" /&gt;

    注:如果下载的不是ODTwithODAC1110720,有可能dll的位置不像是上面提到的那样,需要自己去挨个找了:(

    以上为基本的使用方法,还有几点要注意的地方(部分内容转载自 http://alderprogs.blogspot.com/2009/04/deploying-odpnet-with-oracle-instant.html):

    1:在上面列出的DLL中,其中Oracle.DataAccess.dll和OraOps11w.dll才是ODP.net对应的文件,其余的DLL均为OracleInstantClient对应的文件,ODP.net和InstantClient的版本必须一致,否则会发生错误,只要能保证版本正确,可以视需求另外下载OracleInstantClient(因为InstantClient分几个版本,BASIC,BASIC_LITE等),再将这几个DLL文件替换

    2:各版本的ODTwithODAC包,其DLL位置都不相同,在新版本的包中,上面列出的DLL中,有些DLL已经去掉了(比如orannzsbb11.dll),而且Oracle.DataAccess.dll也根据.net的版本分为多个(以ODTwithODAC112030为例,其中包含2.x和4.0两个版本,分别对应vs2005与2010,开发时需要取用对应的包),使用时注意所取的DLL文件是否正确

    3:对于连接字符串,上文中使用的是:

    Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1527))(CONNECT_DATA=(SID=orcl)))
    这个是比较典型的tnsname写法,除了这种写法外,ODP.net还支持将数据源简单地写为:[//]host[:port][/service_name]

    例如,上文中的例子即可写成Data Souce=192.168.0.100:1527/orcl

    此外,在这里也同样可以引用tnsnames.ora中配置好的连接(在本机装有Oracle的前提下),有两个方法:直接在程序中设置环境变量TNS_ADMIN,将其指向networkadmin,或设置环境变量ORACLE_HOME,程序会自动去 %ORACLE_HOME% etworkadmin下查找tnsnames.ora

    4:进行数据库连接和查询修改之前,有一些环境变量的设置可能会影响到程序的运行结果,同时,如果本机以前已经安装过Oracle,它的一些设置也会影响到程序的运行,所以,在程序打开连接之前,可以视情况适当选用下面的一些环境变量,来保证程序运行结果的正确(注意这部分是从英文资料中转载过来的,有部分变量值对于中文环境来说可能会出现问题,请酌情修改)

    Environment.SetEnvironmentVariable("ORA_TZFILE", null);
    Environment.SetEnvironmentVariable("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8");
    Environment.SetEnvironmentVariable("NLS_DATE_FORMAT", "DD-MON-RR");
    Environment.SetEnvironmentVariable("NLS_TIME_FORMAT", "HH.MI.SSXFF AM");
    Environment.SetEnvironmentVariable("NLS_TIMESTAMP_FORMAT", "DD-MON-RR HH.MI.SSXFF AM");
    Environment.SetEnvironmentVariable("NLS_TIMESTAMP_TZ_FORMAT", "DD-MON-RR HH.MI.SSXFF AM TZR");

    ---------------------------------------------------------------------------------11.2.0.3.0(ODTwithODAC112030.zip)版本--------------------------------------------------------------------------------------------------------------------------

    .net4.0中使用ODP.net访问Oracle数据库(无需安装oracle客户端部署方法)

     

    1、在没有安装oracle客户端的设备上也能访问服务器上的oracle (通俗的讲就是:开发的应用程序 和 oracle数据库服务器分别在两台电脑上)
    2、不需要配置TnsNames.Ora文件

    开发环境 :

    操作系统:win10

    开发工具:VS2010

    运行环境:.net 4.0

    首先要下载odp.net文件,可以在这个页面下载Oracle Data Access Components (ODAC) Downloads  (http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html),

    我下载的是ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0)这个版本。

    ODTwithODAC112030.zip 221 MB (231,828,322 bytes)

    下载完成之后先用winrar解压,不用安装。

    然后,在ODTwithODAC112030文件夹找

    第一个路径: ODTwithODAC112030stageComponentsoracle.ntoledb.odp_net_211.2.0.3.01DataFiles  找到  filegroup2.jar 文件,

    用winrar解压 filegroup2.jar ,

    解压后 ODTwithODAC112030stageComponentsoracle.ntoledb.odp_net_211.2.0.3.01DataFilesfilegroup2odp.netin4

    目录中找到 Oracle.DataAccess.dll

    第二个路径:ODTwithODAC112030stageComponentsoracle.ntoledb.odp_net_211.2.0.3.01DataFiles  找到  filegroup16.jar  文件,

    用winrar解压 filegroup16.jar ,

    解压后 ODTwithODAC112030stageComponentsoracle.ntoledb.odp_net_211.2.0.3.01DataFilesfilegroup16in

    目录中找到 OraOps11w.dll

    第三个路径:ODTwithODAC112030stageComponentsoracle.rdbms.rsf.ic11.2.0.3.01DataFiles  找到  filegroup2.jar 文件,

    用winrar解压 filegroup2.jar,

    解压后 ODTwithODAC112030stageComponentsoracle.rdbms.rsf.ic11.2.0.3.01DataFilesfilegroup2in

    目录中找到 oci.dll.dbl  和  ociw32.dll.dbl ,去掉 .dbl  文件就变成了oci.dll  和 ociw32.dll

    第四个路径:ODTwithODAC112030stageComponentsoracle.rdbms.rsf.ic11.2.0.3.01DataFiles  找到  filegroup3.jar 文件,

    用winrar解压 filegroup3.jar,

    解压后 ODTwithODAC112030stageComponentsoracle.rdbms.rsf.ic11.2.0.3.01DataFilesfilegroup3in

    目录中找到 oraocci11.dll

    第五个路径:ODTwithODAC112030stageComponentsoracle.rdbms.ic11.2.0.3.01DataFiles 找到  filegroup4.jar 文件,

    用winrar解压 filegroup4.jar,

    解压后 ODTwithODAC112030stageComponentsoracle.rdbms.ic11.2.0.3.01DataFilesfilegroup4instantclientlight

    目录中找到 oraociicus11.dll

    第六个路径:ODTwithODAC112030stageComponentsoracle.ldap.rsf.ic11.2.0.3.01DataFiles 找到  filegroup1.jar 文件,

    用winrar解压 filegroup1.jar,

    解压后 ODTwithODAC112030stageComponentsoracle.ldap.rsf.ic11.2.0.3.01DataFilesfilegroup1in

    目录中找到 orannzsbb11.dll

    如何报下面的错误:

    ORA-12737: Instant Client Light: unsupported server character set %s

    是因为缺少 oraociei11.dll 这个动态链接库。

    第七个路径:ODTwithODAC112030stageComponentsoracle.rdbms.ic11.2.0.3.01DataFiles 找到  filegroup3.jar 文件,

    用winrar解压 filegroup3.jar,

    解压后 ODTwithODAC112030stageComponentsoracle.rdbms.ic11.2.0.3.01DataFilesfilegroup3instantclient

    目录中找到  oraociei11.dll

    最后把这些动态链接库

    Oracle.DataAccess.dll 

     OraOps11w.dll  oci.dll  ociw32.dll oraocci11.dll  oraociicus11.dll orannzsbb11.dll 

    oraociei11.dll

    复制到项目中,C/S架构的要与exe一个文件夹,B/S架构的有专门的bin目录。

    我将这些动态链接库放在压缩包里供大家下载

    odp_net_client_dll.part1.rar

    odp_net_client_dll.part2.rar

     因为 oraociei11.dll 文件100多兆,无法上传。

    用VS2010(C#)新建一个项目(选择.net framework 4.0) ,添加引用Oracle.DataAccess.dll

    编码如下:

    using Oracle.DataAccess.Client;

                string connstring = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.123)(PORT=1521))" + 
                                    "(CONNECT_DATA=(SID=xe)));User Id=system;Password=test963;";
                using (OracleConnection conn = new OracleConnection(connstring))
                {
                    conn.Open();
                    string sql = "select * from cd_subject";
                    using (OracleCommand comm = new OracleCommand(sql, conn))
                    {
                        using (OracleDataReader rdr = comm.ExecuteReader())
                        {
                            DataTable dt = new DataTable();
                            dt.Load(rdr);
                            dataGridView1.DataSource = dt;
                            dataGridView1.Refresh();
                        }
                    }
                    conn.Close();
                }

    实测环境

    操作系统:winxp 

    运行环境:.net4.0

    测试了简单的SQL语句

    结果:可以正常访问服务器上的oracle数据库。

  • 相关阅读:
    win8设置无线网络共享
    设计模式学习每天一个——Decorator模式
    【转】命令模式(command pattern)
    设计模式总览
    设计模式学习每天一个——Command模式
    设计模式学习每天一个——Observer模式
    【转】UML解惑:图说UML中的六大关系
    设计模式学习每天一个——Strategy模式
    深入学习
    设计模式学习每天一个——Singleton模式
  • 原文地址:https://www.cnblogs.com/zouhao/p/9001405.html
Copyright © 2011-2022 走看看