Oracle Data Provider for .NET的使用(托管与非托管(一))
简单的概述
ODP.NET的含义是 Oracle Data Provider for .NET的简写。
简单的使用
下面的例子是一个简单的C#命令行程序,它实现了最基本简单的使用ODP访问Oracle数据的功能。
///使用非托管代码工具访问,此方法与引用System.Data.OracleClient非常相似,但是性能要比后者好很多。
using System;
using Oracle.DataAccess.Client;
class Sample
{
static void Main()
{
// Connect to Oracle
string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
// Display Version Number
Console.WriteLine("Connected to Oracle " + con.ServerVersion);
// Close and Dispose OracleConnection
con.Close();
con.Dispose();
}
}
///这是使用非托管代码的访问,可以编译成anycpu的目标平台。
using System;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
namespace Connect
{
class Program
{
static void Main(string[] args)
{
try
{
// Please replace the connection string attribute settings
string constr = "user id=scott;password=tiger;data source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
Console.WriteLine("Connected to Oracle Database {0}", con.ServerVersion);
con.Dispose();
Console.WriteLine("Press RETURN to exit.");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Error : {0}", ex);
}
}
}
}
非托管系统要求
- 操作系统
- 32位WINDOWS7+的系统
- 可以使用
32-BIT ODP.NET
- 可以使用
- 64位WINDOWS7+系统
- 可以使用
32-BIT ODP.NET
或者64-BIT ODP.NET
- 可以使用
- 32位WINDOWS7+的系统
- .NET版本
- ODP.NET FOR .NET2.0只能在.NET 3.5SP1+上使用
- ODP.NET FOR .NET4.0 只能在.NET4.0 4.5 4.5.1 4.5.2 4.6(目前测试了这些)上使用
- ORACLE
- 服务器软件版本:oracle10g release2 +
- 客户端(Oracle Client)12.1[注:此软件将会随着ODP.NET一起安装,如果你下载了ODP.NET之后执行安装的话]
托管驱动系统要求
- 操作系统,与非托管相同,操作系统位数不受限制,可以编译成AnyCpu,在32位和64位平台上自动选择执行。
- .NET版本,目前只有4.0版本,与非托管的4.0版本要求相同
- ORACLE,与非托管相同
其它的注意事项
- 使用了
自动提升事务
和分布式事务
的应用程序,需要安装Oracle Services for Microsoft Transaction Server 12.1
,ODP.NET只为分布式事务提供读写隔离级别(隔离级别)的支持。- 非托管驱动需要
Oracle Services for Microsoft Transaction Server
来支持获取、提交、恢复的服务 - 托管驱动只需要
Oracle Services for Microsoft Transaction Server
来支持恢复的服务,获取和提交的服务已经由托管驱动提供。
- 非托管驱动需要
ENTITY FRAMEWORK(以下简称EF)系统要求
实现EF的db first、Model First要求:
- ODP.NET 11.2.0.3以上
- .NET 4.0+
如果要使用vs的工具,需要使用vs2010以上肯安装Oracle Developer Tools for Visual Studio。
ODP.NET版本说明
从11.2.0.1.2开始,ODP.NET非托管驱动包含两个DLL集合,一个支持.NET2.0一个支持.NET4.0以上,托管驱动则只支持.NET 4.0及以上。
安装ODP.NET
安装非托管驱动
- ODP.NET其实也是ODAC的一部分,ODAC可以从ORACLE官网下载,从ODAC11.1.0.6.20开始,ODP.NET可以通过XCOPY或者安装器来安装。
- XCopy
- 管理员通常使用XCopy来为为数众多的机器部署ODP.NET。在安装和配置期间,XCopy显得比安装器要小而且透明。
- 使用安装器安装
- 开发者或者管理员使用oracle通用安装器来自动安装ODP.NET,它包含了XCopy中所没有的文档和示例代码。
- XCopy
使用安装器安装(OUI)
在安装的时候,ODP.NET的动态帮助会自动安装到vs中,以支持在线帮助。通过动态帮助功能,用户可以通过F1来时刻获得Oracle的帮助以及查询相关文档。
ODP.NET会在machine.
config文件中创建一个对象,来使得所有的应用可以使用oracleClientFactory类,这也同时让DbProviderFactories类识另ODP.NET。
ODP.NET非托管驱动的EF6和CodeFirst功能,可以通过NuGet来获得,OUI和XCOPY也包含了这些包,但是,需要一些外加的配置步骤。NUGET会自动完成这些步骤[除了连接字符串的设置,大哥这个你也不愿意让它设置吧]。
安装完成以后,我们可以在ORACLE_BASE\ORACLE_HOME\odp.net\bin\找到我们安装的东西,而且,当前的GAC中会被添加ODP.NET的DLL,这保证了以前的应用程序也可以随便使用更新过的ODP.NET。当然,如果不想这样,则应该去GAC中将这些DLL移除。
XCOPY的安装方式
安装前需知:
确保zip中的所有文件都没有被OUI安装过
在完成文件的解压后,此产品必须立即进行安装然后使用install_odpm.bat来配置
安装步骤:
1、下载ODP.NET的托管zip包。
2、解压zip包,并将其放至你想要安装的地方(注意,它将永远待在那里,我们称为base目录),base目录中出现两个文件夹,ODP.NET是放非托管驱动文件的;network是放ORA文件的。
4、执行Instal_odpm.bat来安装和配置ODP.NET托管驱动:注意:请使用管理员权限来运行odpm文件
dopm语法:install_dopm.bat Oracle主目录 目标平台 机器范围配置
目标平台:X86,X64,或者两个都写,即both.
机器范围配置:true或者false.
如果机器位宽配置选择了true,则会将驱动添加到GAC中。如果选择false,那么将不会修改MACHINE.CONFIG(修改MACHINE.CONFIG的作用是将驱动添加到GAC)。
如果dll未引用至GAC,那么需要在应用程序的CONFIG的文件中进行相关的配置(包括:configSections,DbproviderFactories以及Provider的具体的相关配置等),应用程序才可以使用ODP.NET。同时,此情况下,由于新的ODP.NET更新,必须要手动修改应用程序的bin目录中的DLL文件。
托管驱动卸载
在base目录中执行uninstall_odpm.bat文件,参数与安装时执行install_odpm.bat相同.
非托管驱动绿色配置
安装完成以后,我们发现,在machine.config中多出了如下的配置
<configSections>
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<system.data>
<DbProviderFactories>
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="D:\Green\oracle11x86" />
<setting name="TraceOption" value="1"/>
<setting name="PerformanceCounters" value="0" />
</settings>
</version>
</oracle.manageddataaccess.client>
我们只需要在我们的应用程序config文件中加入以上配置,然后引用Oracle.ManagedDataAccess.dll
这个文件。
需要注意的是,通过此方法可以配置TNS_ADMIN路径,即TNS文件所在的目录
TNS解析的时候寻找的规则是:
1、在oracle.manageddataaccess。client\dataSources\dataSource的alieas属性相等的节点的descriptor属性值。
2、在.NET CONFIG配置中name为TNS_ADMIN的settings的值所指定的目录中寻找tnsnames.ora文件。
3、在.exe文件所在的目录中寻找tnsnames.ora文件。
4、由系统环境变量所指定的变量TNS_ADMIN所指定的目录中寻找tnsnames.ora文件(由测试发现,未找到官方说明)。
**需要特别说明的是:在IIS承载的web系统中,如果在系统环境变量中设置了TNS_ADMIN变量,那么,必须要在应用程序池
中设置这个应用程序池的属性“是否允许加载用户配置”为true
补充:好多人在使用的时候,会发现,带参数的请求有时候可以正确执行,有时候不可以,经过查询,终于找到了答案:
问题源于System.Data.OracleClient中,默认绑定的变量是按照名称来绑定的,而在ODP中,则默认是按照顺序来绑定的,所以,出现参数匹配错乱的情况,这里,只需要给Command.BindByName = true;
即可。
转-载请注明原地址:http://www.cnblogs.com/ensleep/p/4817173.html
Oracle Data Provider for .NET的使用(托管与非托管(一))的更多相关文章
- Oracle Data Provider for .NET 的使用经验
原文:Oracle Data Provider for .NET 的使用经验 Oracle Data Provider for .NET 是Oracle提供的基于Ado.net接口的一个开发包. ...
- Oracle Data Provider for .NET now on NuGet
Oracle Data Provider for .NET now on NuGet 时间 2015-03-02 22:30:00 Oracle Bloggers原文 http://cshay.b ...
- Oracle Data Provider for .NET Support for Microsoft .NET Core
Oracle Data Provider for .NET Support for Microsoft .NET Core的官方地址,记录下来,按照官方描述,会在2017年底左右发布,暂时还没有看到相 ...
- C# 托管和非托管混合编程
在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是 ...
- [.net 面向对象程序设计进阶] (8) 托管与非托管
本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托 ...
- C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别
1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. ...
- 利用C#Marshal类实现托管和非托管的相互转换
Marshal 类 命名空间:System.Runtime.InteropServices 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与 ...
- [转]C# 之DLL调用(托管与非托管)
每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX ...
- C#的托管与非托管大难点
托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法被计算机识别的.需要先将高级语言翻译为机器语言,才能被机器理解和运行.在标准C/C++中,编译过程是这样的:源代码首先经过预处理器,对 ...
随机推荐
- Linux常用网络带宽监控工具(转)
本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量分开来显示. 一些命令可以显示单个进程所使用的带 ...
- oracle 博客精选
http://mp.sohu.com/profile?xpt=b3JhbmV3c0Bzb2h1LmNvbQ==
- java程序监控tomcat中部署的项目的状态以及控制某些项目的启动停止
原文:http://blog.csdn.net/liuyuqin1991/article/details/49280777 步骤如下: ①:首先授权用户使获得这些权限 You can find the ...
- 【微信】微信小程序 调用this.setData报错this.setData is not a function;
在调用方法过程中 报错如下: 代码如下: Page({ /** * 页面的初始数据 */ data: { userLocalInfo:'用户地址' }, /** * 返回swapping页面 */ b ...
- IP分类:A,B,C,D,E五类
IP地址分为五类: IP地址分为五类:A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验. 常用的三类IP地址 IP = 网路地址(网络号)+主机地址(主 ...
- Linux内核锁与中断处理
Linux内核锁 在Linux内核里面,一般采用了如下几种锁的机制,来保证多线程的同步与互斥: (1)原子操作 atomic_t v: void atomic_set(atomic_t *v, int ...
- 关于计算机中的《补码》,公式:-n=~n+1 引伸:~n=-n-1
在计算机系统中,数值一律用补码来表示(存储).主要原因是使用补码可以将符号位和其他位统一处理:同时,减法也可以按加法来处理.另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃.补 ...
- redis学习笔记——数据类型
对象处理机制 Redis 构建了自己的类型系统,这个系统的主要功能包括:• redisObject 对象.• 基于redisObject 对象的类型检查.• 基于redisObject 对象的显式多态 ...
- Java中的回调函数学习-深入浅出
Java中的回调函数一般来说分为下面几步: 声明回调函数的统一接口interface A.包括方法callback(); 在调用类caller内将该接口设置为私有成员private A XXX; 在c ...
- Android学习(十) SQLite 基于内置函数的操作方式
main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...