ODP.net与Oracle连接

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文件,可以在这个页面下载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.zip\stage\Components\oracle.ntoledb.odp_net_2\11.1.0.7.10\1\DataFiles\filegroup4.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.zip\stage\Components\ oracle.rdbms.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup2.jar)
2、oraociicus11.dll (in ODTwithODAC1110720.zip\stage\Components\ oracle.rdbms.ic\11.1.0.7.0\1\DataFiles\filegroup3.jar)

3、OraOps11w.dll (in ODTwithODAC1110720.zip\stage\Components\Oracle.ntoledb.odp_net_2\11.1.0.7.10\1\DataFiles\filegroup3.jar)

4、oraons.dll (in ODTwithODAC1110720.zip\stage\Components\oracle.ons.ic\11.1.0.7.10\1\DataFiles\filegroup1.jar    ) 


下面这三个有人说需要,有人说不需要,反正也不差这三个,继续吧:
5、orannzsbb11.dll (in ODTwithODAC1110720.zip\stage\Components\oracle.ldap.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup1.jar)
6、oraocci11.dll (in ODTwithODAC1110720.zip\stage\Components\ oracle.rdbms.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup3.jar)
7、ociw32.dll (在jar文件里面叫’ociw32.dll.dbl’,拿出来之后去掉.dbl in ODTwithODAC1110720.zip\stage\Components\ oracle.rdbms.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup2.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,将其指向network\admin,或设置环境变量ORACLE_HOME,程序会自动去 %ORACLE_HOME%\network\admin下查找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");

转载于:https://www.cnblogs.com/lijianhua/p/7425996.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付宝后台如何查看自己的签约详情

第一步&#xff1a;登录蚂蚁金服商家服务中心https://b.alipay.com/&#xff0c;点击产品中心&#xff0c;如下图第二步&#xff0c;点击我的产品-已生效-产品详情&#xff0c;&#xff08;如果在已生效界面看不到自己调用接口对应签约的产品&#xff0c;那么你的签约已经失效&…

从Sun离职后,我“抛弃”了Java,拥抱JavaScript和Node

我是前Sun公司Java SE团队的一名成员&#xff0c;在工作了10多年之后——2009年1月——也就是在甲骨文收购Sun公司之前&#xff0c;我离开了公司&#xff0c;然后迷上了Node.js. 我对Node.js的痴迷到了怎样的程度&#xff1f;自2010年以来&#xff0c;我撰写了大量有关Node.js…

修改oracle SGA,以提高oracle性能

修改oracle SGA&#xff0c;以提高oracle性能 在正常情况下&#xff0c;查询非常慢。1、检查SGA大小&#xff0c;以DBA身份连接到oracle数据库&#xff0c;输入show sga。2、如果SGA过小&#xff0c;请修改其大小修改SGA必须保持的原则&#xff1a;1).sga_target不能大于sga_m…

ALIN10129-自查方案

原贴地址&#xff1a;https://openclub.alipay.com/read.php?tid3374&fid60&#xff0c;欢迎大家访问 报错说明及截图&#xff1a;这个错误一般常见于支付宝老版本的移动支付mobile.securitypay.pay接口中错误原因&#xff1a; 移动支付接口没有权限&#xff08;也就是这个…

实现Repeater控件的记录单选(二)

前一篇《实现Repeater控件的记录单选》http://www.cnblogs.com/insus/p/7426334.html 虽然可以实现对Repeater控件的记录进行单选&#xff0c;但是&#xff0c;你需要懂得写正则表达式和需要写C#程序重写。好吧&#xff0c;方法也许往往不止一种。 先去掉重写的代码&#xff1a…

mongoose 查询 find 指定字段

在第二个参数中填写字符串&#xff0c;需要查询的字段用空格相连。 const Person mongoose.model(Person, yourSchema); // 查询每个 last name 是 Ghost 的 person&#xff0c; select name 和 occupation 字段 Person.findOne({ name.last: Ghost }, name occupation);官方…

Oracle - 新装数据库、新建用户注意事项

Oracle - 新装数据库、新建用户需要注意的几点 目前&#xff0c;新装数据库一般会建两个tablespace: cdmadata, cdmaidx。在新建用户时&#xff0c;一般赋予新用户几个role&#xff1a;角色说明connect用于连接&#xff0c;数据访问&#xff0c;还可以修改本schema的对象resour…

HAS_NO_PRIVILEGE解决方案

报错信息如下&#xff1a;错误原因&#xff1a; 1、没有签约这个接口的合同 &#xff01; 2、签约了相应的接口合同&#xff0c;但没有生效 &#xff01; 3、签约过期导致&#xff0c;如果你之前都可以使用对应的接口&#xff0c;但是近期使用就报错这个&#xff0c;一般就是…

C# 实例练习——字符串处理(第三天)

1. 编写程序将IP地址分解后输出&#xff08;将IP地址中的点&#xff08;.&#xff09;去掉&#xff0c;替换成空格符&#xff09;&#xff0c;如&#xff1a;132.123.4替换后为132 123 4。 1 Console.WriteLine("请输入您电脑的IP地址&#xff1a;"); 2 …

vue router 常用操作 重定向 redirect

1、重定向 redirect const routes [{ path: /, redirect: /index},{ path: /index, component: index } ]2、嵌套路由 const routes [{ path: /index, component: index,children: [{ path: info, component: info}]} ]通过/index/info就可以访问到info组件了 3、懒加载 …

oracle 10g冷备份恢复处理详细步骤

oracle 10g冷备份恢复处理详细步骤 oracle 10g采用spfile启动数据库。1、做备份恢复之前先将数据库关闭&#xff0c;复制spfile、数据文件、控制文件和日志文件拷贝到其它目录。2、删除oracle 10g数据库程序&#xff0c;再重新安装数据库3、新建一个与之前数据库相同的数据库4、…

OAuth授权

OAuth授权的介绍 OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准OAuth 的授权不会使第三方触及到用户的帐号信息OAuth 允许用户提供一个令牌&#xff0c;而不是用户名和密码来访问他们存放在特定服务提供者的数据每一个令牌授权一个 特定的网站 在 特定的时段…

mongoose 分页查询

使用插件mongoose-paginate进行分页查询&#xff0c;这个库已经2年不更新了&#xff0c;但下载量还是比较大的。 地址https://www.npmjs.com/package/mongoose-paginate 列举开发过程中常用的代码片段&#xff1a; 1、查询某个字段 使用select: title date author var query …

World从任意页开始设置页码详细教程

我这边使用world建了5页&#xff0c;以此来细说如何使用World从任意页开始设置页码&#xff0c;以下为详细教程 首先&#xff0c;假设你从第三页开始设置页码&#xff0c;那么你的需求是将第三页设置为页码1&#xff0c;第四页为页码2&#xff0c;以此类推&#xff0c;具体的操…

移动表到另一表空间命令

移动 表、表分区、LOB字段、索引、分区索引 到另一表空间 alter table 命令移动 table, partition, lob字段alter index 命令移动 索引, 分区索引移动表π 移动表&#xff08;非分区表&#xff09;&#xff1a; alter table <schema.table> move tablespace <new tab…