`
梁利锋
  • 浏览: 80518 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

终于支持了 Oracle

阅读更多

  我个人没有使用过 Oracle 做开发,不过以前就知道,要让 DbEntry 支持它是很困难的。最近,其它功能趋于完善,也考虑加入 Oracle 的支持,而且,因为项目论坛上的一些提议,已经加入了 Firebird 的支持,而 Firebird 也是使用序列的方式产生自增主键值,以前知道的 Oracle 的困难点已经跨越了一多半。

  于是开工,仿照 Firebird,参考 Hibernate,编写了 Oracle 的方言,看起来很美。 用例子程序测试,马上发现问题,Decimal 无法转换为 Int32。是啊,Oracle 不支持 int, bigint, smallint 这些数据类型,在 hibernate 的方言里,也是使用的 number(10,0) 之类的方式,我也是一样,这样,返回的是 Decimal 也在情理之中。

  于是在 Oracle 管理程序中,使用一些 SQL 语句测试,发现,Create 语句中,支持 INT,查看创建出的表,是 number(*,0)。不指定数字大小么?也是一个思路,于是把主键设置为 number(*,0),输入1,支持,输入12位数字,还是支持,用程序访问,DataReader.GetInt32(),在第一个数字的时候正常返回,遇到第二个数字出异常,也算合理。但是发现,如果使用 DataReader[index] 之类的方式取数据的话,还是得到 Decimal。

  也许是微软提供的 Provider 不完善吧,于是换用 Oracle 自己提供的 ODP.NET,这一次,连 DataReader.GetInt32() 也会出异常了……

  本来挺生气,可是仔细想一想,也就明白了,数据库中根本就没有这个数字是 Int32 还是 Int64 之类的信息,作为驱动程序,自然也无法智能的猜到数据类型了。

  已经走了这么远了,就应该走完吧,既然数据库本身没有这些信息,就由我来告诉它吧。编写了一个 StupidDataReader 用来包装 OracleDataReader,在构造函数中把各个列的类型信息传递给它,由它在内部做类型转换工作。

  测试,成功。呼呼,终于支持了 Oracle 。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics