XiaoHui.Net 笑汇程序员论坛.Net 讨论区

   .NET框架中数据库程序的可移植性


页: [1]

walksnake2006-4-16 10:12
.NET框架中数据库程序的可移植性

在DOTNET框架中,要访问数据库,需要用到根据各个数据库特性而定义的类库。例如,如果要访问SQL SERVER数据库,需要用到以下类:SqlConnection,SqlCommand,SqlDataReader,SqlDataAdapter等;要访问OleDb,需要用到以下类:OleDbConnection,OleDbCommand,OleDbDataReader,OleDbDataAdapter等;要访问ORACLE又是另外一套类库,虽然这样可以定义出很多特定的数据库特性,但是不利于数据库程序的移植性。
    在开发数据库程序中,我们通常的做法是将数据层抽象出来,将数据库映射到对象中。例如,在我们的数据库中有一个表Student,它包含以下字段:Student{id,name,sex,birthday},我们可以为此定义一个类:

[code]
public class Student
{
public int Id{get;set;}
public string Name{get;set;}
public SexType Sex{get;set;}
public DateTime Birthday{get;set;}
}
[/code]
这时我们仅仅完成了数据对象的定义工作,要将这个类和表进行有效关联,我们还需要做很多工作,比如:读取数据到对象中、将对象中的数据保存到数据库中、删除数据等等。这些工作要求对象要有与数据库进行通信的机制。(在这里,我们先不考虑事务的问题)
要进行通信,就需要用到本文开头所说的那些与特定数据库相关的特性类。然而问题就出来了,如果我们开始用SQL SERVER数据库,这时我们要改成ORACLE数据库时,怎么办?我们只有用ORACLE特性的类重写一次通信代码。这浪费了很多时间。
有没有办法来很轻松地实现数据库的移植?一种做法是采用.NET环境下的Hibernate,目前有一套比较成熟的Hibernate开源组件NHibernate,但是这是比较复杂的做法,如果您的程序不大,用这样的方法会很耗费时间,有没有比较轻量级的做法呢?
我们可以仔细看看这些特性类,就会发现,无论是那种数据库,他们用到的类,都继承自IDbConnection,IDbCommand,IDbDataAdapter,这样,我们就可以针对这些接口来做些事了。
假使我们所有的数据库映射对象和数据库之间的通信都采用这些接口来编程,那么我们就不用担心数据库的移植问题了。
本人实现了这样一个过程,只是还没发现怎样上传文件,郁闷得很!

[[i] 本帖最后由 walksnake 于 2006-4-16 18:16 编辑 [/i]]


XiaoHui2006-4-16 12:06
walksnake? 呵呵, 你也来了啊?欢迎。:)

ctrl122006-4-16 16:18
没有错的,NHibernate在应用的时候确实非常方便,但是配置起来

walksnake2006-4-17 03:39
不过过多考虑可移植性,就意味着很多有用的特性就会失去。比如SQL SERVER的存储过程。

walksnake2006-4-17 03:44
NHibernate的配置文件,可以用MyGeneration工具来做,类和配置文件都生成好了。但是好像生成的配置文件里的所有类型都被UnKnown来代替了。还没找到解决办法!

ctrl122006-4-17 08:00
当然,有得必有失嘛,不过我觉得各种数据库的特性东西可以通过获得不同的连接类型来操作不同的特性,比如NHibernate
在配置的时候,需要指定驱动类型NHibernate.Driver.SqlClientDriver,那么就可以通过这个来选择不同的数据库特性操作了


查看完整版本: .NET框架中数据库程序的可移植性