ADO.NET相对ADO有一处很大的变化,即对不同类型的数据库,要使用各自的一组数据库类。比如说SQL Server数据库要使用SqlConnection, SqlCommand, SqlDataAdapter等类,而对Access数据库则使用OleDbConnection, OleDbCommand, OleDbDataAdapter等类。这样的设计应该是从性能上考虑的,而且在使用时也显得条理清晰。但在经过一段时间的学习与使用之后,我发现这个设计在以下的方面会使用开发人员花去很多时间:
a) 开发人员每次编程时都要注意该用哪一组类,而不是完全关注于数据库的操作逻辑与执行的功能;b) 当数据库类型改变时,程序要做很大的改动。
有没有方法解决以上为题。让一段程序(不改动的前提下,只修改某一个参数)去适应不同的数据库

解决方案 »

  1.   

    完全可以。ADO.NET提供了一组抽象接口IDbConnection, IDbCommand, IDbDataAdapter, IDbDataParameter, IDbTransaction, IDataReader等等,SqlClient/OleDBXXX的各种类都分别实现了这些接口,你可以编写以接口为导向的代码,并以工厂模式提供针对不同数据库类型的连接初始化支持。MS的示范程序,PetShop 3,应该有这方面的代码。你可以参考。
      

  2.   

    但是要想完全不担心数据库之间的差异那是骗人的,例如Access不支持存储过程等固有的数据库系统间差别,不是这样能够忽略的,在进行这样的移植的时候,改动是不可避免的,区别仅仅在于代码量的大小。
      

  3.   

    参考一下MS的例子petshop吧,它就是构思好适应不同数据库的
      

  4.   

    当然可以,微软写好了一个BLOCK,你可以试试看。
    只是还有小小的区加紧就是
      

  5.   

    同意Miracle(新一代的开山怪)的观点,数据访问层可以用接口来实现,例如以IDbTransaction为例,他实现了OleDbTransaction,SqlTransaction,OracleTransaction类,所以程序的编写如果要实现事务操作可以实现IDbTransaction接口,这样以来,一旦数据库变化(sql-oracle),只需要修改原来到Oracle的存储过程,如果参数什么的不变,就不需要再动数据访问层,这是一个很好的面向对象的思想,需要大家都好好体会,共同进步:)
      

  6.   

    1.Access也是支持存储过程的,而且在.net里用法和SQL Server的用法是一样的2.为每一个数据库写一个数据通用层就行了,保持他们的函数名称(包括命名空间、类名、方法、事件、属性等)一致就行了。编译成dll文件,换数据库的时候换一个dll就行了。3.不同的和数据库确实有不一样的地方,这就需要在编写的时候尽量用标准的T_SQL语言。这样主流的数据库都是支持的。
      

  7.   

    1.Access也是支持存储过程的,而且在.net里用法和SQL Server的用法是一样的
    =============
    是吗?好久没有用Access了(以前用Access 95,没注意过),不知道Access居然也支持存储过程。是Access 95以后新加入的功能?
      

  8.   

    使用IData和IDb接口,使用标准的SQL语言而不是TSQL(仅有微软支持),尽量使用SQL语言生成器,例如Adapter而不是手写,因为生成器会针对不同的数据库生成不同的SQL语句。
      

  9.   

    刚才看了一下Access的Reference,Access本身并不支持SP,仅仅当你建立了Access Project以后,连接到一个SQL Server数据库,参能够使用SP,但这是SQL Server的能力,是题外话。Access database (*.mdb)不支持SP.
      

  10.   

    我的想法是写两个(多个)一样的数据层——内部的实现方法不一样,但是对于调用的角度来看是一样的。这样的话才可以做到,当要换数据库的时候不需要修改代码,只需要换一个DLL文件就可以的目的。如果用其他的方法(包括接口),恐怕都要在调用的时候指定一下要访问的是什么数据库。这样的话,换数据库了就必然要修改代码。
      

  11.   

    没有不换一句代码的可能!
    可以将各种数据库的相关内容,如connectionstring 等用Xml文件写好。
    当用什么数据库时去读取xml中的相应的节点,采用工厂模式!
      

  12.   

    不换代码,只换dll(数据层)文件。只要不用不兼容的查询语句可就行。比如 select * from dbo.table 这样的语句转到access里就会出错;
    而这样写就不没事了 select * from talbe 这是数据库理解查询语句上的差异,并不能说明方案不可行。要换的是查询语句,而不是程序代码。