clq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://blog.csdn.net/wanglihuahaiyan/article/details/4381417

--------------------------------------------------

dotConnect For Oracle是Devart公司出品的一个.net平台访问Oracle数据库的一个驱动。它的专业版本是一个收费版本提供了许多别的驱动所没有的功能与 特性,如对Linq To Oracle,Ado.Net Entity Framework For Oracle支持等。我们一般不会去买它来作开发,在实际项目中使用它的破解版本也不太合适。这里我们使用的是它的Express免费版本,这个版本提供 的功能和微软和Oracle提供的版本基本一致。这个版本可以从下面的链接下载。
http://www.devart.com/dotconnect/oracle/dcoraclefree.exe

我考虑使用这个免费版本的理由如下:
1. 微软将在最新版本的.Net Framework中(4.0中吧),不再提供它们的Oracle驱动。这使用我对其它厂商提供的Oracle驱动产生了好感。
2. 使用微软提供的驱动有个几乎是无法解决的问题,就是OCI-22053 溢出错误 overflow error。Oracle 数值数据类型最多可存储 38 个字节的精度。当将 Oracle 数值转换为公共语言运行库数据类型时,Oracle 值可能会变得过大。这会导致 Oracle OCI-22053 溢出错误。特别是我们获取用avg等SQL函数算出来的数值时,经常会碰到这个问题。解决的办法是把数值精度在SQL语句中截短或把数值转换成字符串。但 这总有点不爽吧。而 Devart dotConnect For Oracle则没有这个问题。
3. dotConnect For Oracle对Oracle数据库的各种编码都支持的很好。
4. dotConnect For Oracle可以在没有安装Oracle Client的机器上访问Oracle数据库服务。
5.性能上的考虑。按照Devart提供的数据,dotConnect For Oracle在性能上比微软和Oracle提供的驱动都要好。具体可以参考http://www.devart.com/dotconnect/oracle/performance.html

NHibernate是一个开源的ORM框架,不大可能对具有商业性质的Devart dotConnect For Oracle直接支持。但我们可以通过扩展NHibernate让其支持Devart的驱动。

新建一个类库(ClassLibrary)工程,取名为NHibernate.DevartOracle,生成的Dll名和默认命名空间均为 NHibernate.DevartOracle。同时添加对NHibernate相关dll的引用,项目的引用类库和文件结构如下图中所示。这里使用的 NHibernate是当前取新版本2.1.0GA。

新建类DevartOracleDriver继承之OracleClientDriver。在这个类中可以让NHibernate生成 IDbConnection和IDbCommand时使用Devart dotConnect For Oracle的实现。如果让DevartOracleDriver继承之ReflectionBasedDriver类也能实现同样的功能。但我觉得从 OracleClientDriver类继承在运行时的效率会更高一点,DevartOracleDriver类的编写也要简单一些。

如果现在在NHibernate的connection.driver_class配置中使用DevartOracleDriver类。我们发现 NHibernate会报错,报错报在OracleDataBaseSchema类中的GetReservedWords方法中。这就说明Devart dotConnect For Oracle中的有些实现还是和System.Data.OracleClient,Oracel.DataAccess中的有点不一样。幸好 OracleDataBaseSchema类中的GetReservedWords方法是可以重写(override)的。我们可以新建一个 OracleDataBaseSchema类的子类,重写GetReservedWords方法。我们将新建的子类命名为 DevartOracleDataBaseSchema。

为了使用我们自己的DevartOracleDataBaseSchema,必须重写 Oracle8iDialect,Oracle9iDialect,Oracle10gDialect类中的GetDataBaseSchema方法。我 们将三个子类分别命名为 DevartOracle8iDialect,DevartOracle9iDialect,DevartOracle10gDialect。在实际应用 中我们可按Oracle数据库类型选用上述的三个Dialect。


 

在NHibernate的配置中,可以按下面的配置方式使用我们自己的Dialect和Driver。


 
至 此我们就可以使用NHibernate.DevartOracle.dll在我们的应用中方便地用Devart dotConnect For Oracle作为我们访问Oracle数据库驱动,享用其带来的优秀特性。这应该感谢NHibernate框架的可扩展性,可自定义性。这其实也是任何优 秀框架的基本要求。

posted on 2011-08-12 10:29  clq  阅读(1240)  评论(1编辑  收藏  举报