托管点击打开链接
全托管oracle驱动,时间大概是2013年初。不再需要安装Oracle客户端,只用一个Oracle.ManagedDataAccess
.dll就ok,而且部分32还是64位。避免问题:在生产环境下的服务器要装一个客户端有时候是挺费周折的,有可能操作系统有这样那样的问题,另外机器上可能已经装好了好几个版本的oracle client,装上去可能影响在用在业务系统。
先把论坛中有人提的问题列一下:
1、因为不需要安装客户端了,所以即使以前装了客户端的话其中的TNS配置也跟当前托管程序集没任何关系了(ORACE_HOME什么的也自然没关系),tns那个文件路径就需要指定了,比如我的machine.config就如下制定了(其实就是安装目录所在那个tns文件),当然你也可以在当前app.config指定
<setting name="tns_admin" value="d:\installsoft\oracle\odp.net_managed121010\odp.net\managed\x64\..\..\..\network\admin" />
在有多个程序都使用同一个数据库地址的时候,使用tns还是很有意义的,这样就能做到整体切换而不用每个去修改,同时也方便管理
2、这些驱动只能用在03以上的系统,.net Framework的版本要在4.0以上,oracle数据库在要10.2版本以上,10.1都不行。
这次是随Oracle ODAC 12c 发布包中包含的oracle全托管驱动,之前Oracle已经发布了两个Beta版本的全托管驱动,但在测试中确实也发现了一些问题,这次发布的12.1.0.1.0 貌似已经是Release正式版了,经过简单的测试,上一个版本我所碰到的Bug已经被修复,目前未发现有什么新的问题,推荐大家使用。
全托管最大的特点:托管代码在公共语言运行库(CLR)中运行。而不需要额外的客户端进程负责维护。
字符连接串有三种方式 :
a、tns 别名:"user id=scott;password=tiger;data source=sales";在此具体的对应tns文件是可以在config文件中指定,比如我的machine.config给我默认了一个<setting name="tns_admin" value="d:\installsoft\oracle\odp.net_managed121010\odp.net\managed\x64\..\..\..\network\admin" />
b、Connect Descriptor:该种方式就是将tns配置的一段拿出来写进去,相比c方式在于可配置项全面
"user id=scott;password=tiger;data source=" + "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" + "(HOST=sales-server)(PORT=1521))(CONNECT_DATA="+ "(SERVICE_NAME=sales.us.acme.com)))"
c、Easy Connect Naming Method:PROTOCOL等一些选项好像就没地方配置了
"user id=scott;password=tiger;data source=//sales-server:1521/sales.us.acme.com"
方法一:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strConn = "User Id=test;password=test;" +
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.120.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));" +
"Pooling=false;";
using (OracleConnection con = new OracleConnection(strConn))
{
con.Open();
string strSQL = "select * from USERS order by ID";
OracleCommand cmd = new OracleCommand(strSQL, con);
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string line = "";
for (int i = 0; i < reader.FieldCount; i++)
{
line += reader.GetName(i).ToString() + "=" + reader.GetValue(i).ToString() + " ";
}
Console.WriteLine(line);
}
}
Console.ReadLine();
}
}
}
方法二
修改连接字符串
string strConn = "User Id=test;password=test;" +
"Data Source=192.168.120.1:1521/orcl;" +
"Pooling=false;";
方法三:
在下载的Oracle.ManagedDataAccess压缩包中,\network\admin\sample目录下有一个tnsnames.ora的文件,修改此文件配置数据库的监听信息,将该文件拷贝到应用程序根目录下。
核心的dll,就是common目录下的Oracle.ManagedDataAccess.dll,不象ODP.NET以前的版本,这次终于不用区分x86/x64版本了,不管是32位还是64位,都是同一个dll。
至于manged/x64、managed/x86这二个目录,是用来向.NET x86或.NET x64的GAC注册程序集的,运行相关的configure.bat后,会自动将common中的Oracle.ManagedDataAccess.dll放入GAC,这样在vs中添加引用时,能自动找到GAC中的相关命名空间
注意因为是全托管,所以并不会去找oci.dll,也不会找注册表中的监听程序,这就要求必须自己配置ora并指定ora文件路径。
string strConn = "User Id=test;password=test;" +
"Data Source=test;" +
"Pooling=false;";
下载后解压所可以看到。
一个readme.htm中只寥寥数语,熟悉的network文件夹相当于与一个tnsnames和sqlnet的模板,managed里也提供一个文档,里面描述也很少,主要介绍一些配置和BUG情况,核心就在common里面的Oracle.ManagedDataAccess.dll这个文件了,Oracle.ManagedDataAccess.Client.Configuration.Section.xsd这个文件一看就知道是提供给vs的xml编辑器提供智能提示的,接着里面还区分了X64和X86的文件夹,一方便主要是分布式事务的Oracle.ManagedDataAccessDTC.dll不同,另一个就是bat文件里相关命令不同了。
如果你对之前的ODP.NET的OraProvCfg已经比较熟悉的话,那么configure.bat里面的内容就很好理解了,这个批处理一共干了这么几件事情,其中2、4、5其实并不是必须的:
1、将驱动对应db factory注册以及添加configuration处理器,其实就是在machine.config里增加<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />和<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />,这样在接下来的开发和部署中才能识别Oracle.ManagedDataAccess.Client的驱动以及oracle.manageddataaccess.client的配置节点(其实如果在单独的程序配置也是可以的,需要注意的是是否使用gac)
2、添加ODP.NET Managed的性能计数器(Performance Counter)
3、将Oracle.ManagedDataAccess.dll添加到GAC中
4、提供在VS开发环境下配置节点的智能提示,其实就是将之前提到的Oracle.ManagedDataAccess.Client.Configuration.Section.xsd拷贝到VS对应目录下
5、添加日志记录
6、添加VS开发环境对Oracle.ManagedDataAccess.dll引用的支持