现开发一个多数据库(Access、sql server、mysql、oracle)支持的web程序,希望大家能提供几个比较好的开发思路??以前做aspnet程序的时候数据库访问层要不用微软的SQLHelper,要不就用自己封装的简单一点的数据库访问层,最好也能用上这个数据访问层希望高手出来解答一下。

解决方案 »

  1.   

    你参考微软的Petshop 很简单 
    工厂模型就行了 在config文件里面配置使用哪一个DAL   
    你完全可以扩展petshop来支持MySql Access  DB2等等
      

  2.   

    我比较了解petshop,每一个数据库我都要做一个这样的dal,没有任何的通用性,有没有其他更好的办法呀??
      

  3.   

    System.Data.OleDb;可以满足,但数据库就发挥不了什么优势了。
      

  4.   

    下面是一个高人说的方法(很多不明白的地方):
           当我们以一个项目的方式来完成软件设计开发时,通常开发的具体环境已经确定,采用的数据库也已经确定,因此不存在支持多数据库方面的需求。但是,如果一个软件以产品的方式出现,需要以同一产品适应不同企业的IT环境时,多数据库支持将是一个非常重要的需求;如何实现多数据库支持,将直接关系到产品的质量及实施和维护成本,关系到产品推广的范围和最终的成败;本文将就当前常用的多数据库实现方式做一简要介绍,并以笔者所在公司开发的某软件中采用的多数据库支持实现技术做一介绍。  实现了多数据库支持的软件产品通常采用以下几种方式:1.统采用分层结构,为每种数据库实现一套数据访问层。该方案具有实现简单、结构清晰的优点,但也具有很多问题。软件中的某功能点修改可能牵涉到多套数据访问层的修改,同时,也会给测试带来成倍增长的工作量;由于实现同样数据访问功能需要对不同数据库编码,所以肯定会带来更大的编码量、引入更多的Bug,影响软件质量。2.系统采用的SQL语句置于系统外部,SQL语句分为多套,每种数据库维护一套SQL语句。该实现方式可以在部分情况下达到不修改代码而调整系统的目的、设置在简单的情况下可达到不修改代码而增加一种新数据库支持的目的。但该实现方式存在调试困难、维护易出错的缺陷。同时,如果系统较复杂的情况下,难以体现出其优点,实用性不高。3.采用标准SQL语句实现多数据库支持。该方法是谈论较多的方法,但真正采用该方法实现了多数据库支持的软件系统的厂商并不多。原因在于各数据库厂商对标准SQL的支持是不完全的,而且,对系统开发者而言,要求其能准确区分出那些是标准SQL,那些是特定数据库SQL,这本身并不现实;而一旦采用了特定数据库SQL而测试又不是非常充分的话,就会埋下很多定时炸弹。 笔者所在公司在实现eHR软件多数据库支持功能前,提出以下要求:1.能很方便的实现对新数据库的支持,最好能达到不修改采用该方法实现的系统的代码就能增加对新数据库支持。2.系统修改、维护容易,编码工作量最好与支持的数据库种类多少无关。针对以上的一些,我们提出了以下的多数据库支持的实现方案:解决方案由三部分构成:SQL实体描述对象、SQL语句生成器、SQL实体执行器;这些部分构成一个介于数据访问层与数据库间的新的软件层(Data I/O Controler),供数据访问层调用;  与通常的多层体系结构软件比较起来,该方案不同之处在于数据访问层访问数据库方法并不是直接执行SQL语句,而是以SQL实体对象的方式描述出对应SQL语句的语意;然后调用SQL实体执行器对SQL实体描述对象处理,生成对应的数据类型的SQL语句,并执行。在SQL执行器中,为了能支持多数据库,需要对没种数据库实现一个以独立DLL方式存在的Adapter,该Adapter接收传入的SQL实体对象,并能根据SQL实体对象描述的语意,生成符合对应数据库语法的SQL语句。Adapter需要实现一系列预先定义好的接口,以方便SQL实体执行器的调用;SQL实体执行器在运行期间才与具体Adapter关联,不必事先知道由何种Adapter处理SQL实体对象;当需要增加对新数据库的支持时,不必修改任何原有软件,只需要实现一个新的Adapter就可;该方案将支持多数据库的复杂性与具体软件隔离开来,将复杂性由通常的分布于软件各处变更为于一点集中处理,可使维护更容易、编码量大大降低,系统可靠性更高;
    关于他说的这个解决方案有没有现成的例子??谁有能否提供一个???请留下您的qq或者msn。
      

  5.   

    那你就做一个通用的数据访问组件 比如DataBase
    然后不同数据库继承或者实现这个DataBase里面的方法 DataBase里面比如有
    ExecuteDataSet()
    ExecuteNonSql()
    ExecuteScalar()
    ....
    等方法或者属性不同的数据有不同的实现方式 
    然后用工厂模型来实例化这个Database就行了
    这样就可以简单的实现多个数据库的支持  
    不过弊病就是你必须写标准的SQL  不能针对某个数据库写SQL,否则移植性还是比较差
      

  6.   

    System.Data.OleDb;可以满足,但数据库就发挥不了什么优势了。看来你了解的太浅显了,用这种方式我还不如webconfig里面配置多个数据库的连接字符串,然后在数据库访问层里面调用相应的类呢。。你的方案和我的方案前提条件之一:得写通用的sql语句。
      

  7.   

    foyuan(暴走零零漆) ( ) 信誉:98 我说的方式跟你说的是一样的。但写标准的sql语句难度比较大哦。呵呵
      

  8.   

    存储过程和触发器就免了,有access。我举几个例子:
    删除数据的sql:
    access:delete * from table 
    sql server: delete from table取前5条数据:
    sql server: select top 5 * from table
    mysql:select * from table limit 5
    这些怎么处理????
      

  9.   

    或者你再用工厂模型实现一个sql生成类你可以参考Gentle.net的源代码 根据不同的数据库生成不同的sql语句 模版方法和工厂方法混合一下 至于具体的代码没有写过
      

  10.   

    可以考虑使用CommunityServer的模式, 但编码工作量比较大.
    也可以使用支持多数据库的ORM产品
      

  11.   

    CommunityServer是完全参照petshop来的,这种方式编码工作量太大了。你说的支持多数据库的ORM产品,倒是一个方法,可否提供几个比较出名的软件???收费的也无所谓。
      

  12.   

    CommunityServer和petshop这种多层结构模式,优点很多,但缺点同样不少。尤其是要写好几倍的代码,实在是受不了。所以在多数据库方面期待更好的解决方案。
      

  13.   

    NHIBERNATE就不错,目前的3.0版本已经蛮稳定了,而且是开源的。
      

  14.   

    sunruping(孙茹苹) 所说的,有意思,值得楼主看看。
      

  15.   

    用ORM 也可以 
    ORM 推荐 Gentle.net、HHibernate、SPLORM也有ORM的优缺点 这个永远讨论不完 和楼主的初衷远了 呵呵
      

  16.   

    定义业务实体 ,用datamapper ,见 http://ibatis.apache.org 的iBATIS.NET
      

  17.   

    用微软件的petshop够了,其他的都是异端,呵呵
      

  18.   

    使用DbConnection一类的方法,可以使实现不同数据库时代码改动最少
    如果字段类型设计的好,甚至可以不用改动代码的
    至少ACCESS和SQL Server可以不用改,当然ACCESS没有存储过程啦
      

  19.   

    地區:北京
    年限:工作2年
    技術:.Net BS开发
    工資:avg>>5K + 福利,几乎不加班,工作开心,心情愉快。
    公司性質:汽车门户网站。 PS: 透露点消息,我们公司正在招.net BS开发人员,如果哪位同仁想换工作,是一个不错的机会选择,加[email protected] 说应聘即可!
      

  20.   

    使用DbConnection一类的方法,可以使实现不同数据库时代码改动最少
    如果字段类型设计的好,甚至可以不用改动代码的
    至少ACCESS和SQL Server可以不用改,当然ACCESS没有存储过程啦这个办法也还行,起码工作量比较少。可以考虑。
      

  21.   

    参考PetShop 4.0:
    它支持Ms SQL / Oracle
      

  22.   

    petshop4.0 抽象工厂模式,解决系统对象发生变化时.
      

  23.   

    to:sunruping (孙茹苹),你的问题正是我想问得,怎么样,有最新解决方案了吗?我的hotmail:[email protected]