正准备设计一个系统,目标数据库是采用Oracle,因技术和软件环境,在开发程序时,我只能采用access,问题就是怎么样有效的进行两数据库的相互切换。因为oracle和access切换不仅仅是connection,还有DataAdapter等等。
  构想一:看有没有既适用于access,又适用于oracle的data,比如采用共同的connection、DataAdapter类等。但不知道有没有这样的类,System.Data.OleDb可否实现这一点?
  构想二:在没有确认构想一的情况下,我自己想建立一个类库,根据数据源去分别调整父类从而适用于access与oracle数据源,如:
    public class SmartDataAdapter:(System.Data.OleDb.OleDbDataAdapter 或 System.Data.OracleClient.OracleDataAdapter)
    当要投入到Oracle中去使用时,只需更改w继承oracle的数据库类。但Data的类都是被封装了,没办法实现。
    因为数据源是不确定的,所以数据源肯定要被独立出来,怎样独立?是建立一个控件实现asp中的incude(不知道可否保护自己的源代码),还是通过写一个类库或其它方式。独立哪些更为合适,是不是只独立connection?放各位大侠指点,若有阐述不清的,请指出。

解决方案 »

  1.   

    /// <summary>
    /// ConnectionType 的摘要说明。
    /// </summary>
    enum ConnectionType
    {
    SqlClient = 1,
    OleDb,
    Oracle
    }/// <summary>
    /// 创建 DbDataAdapete 对象
    /// </summary>
    /// <returns>DbDataAdapete 对象</returns>
    public static IDbDataAdapter CreateDbDataAdapter()
    {
    switch ( connectionType )
    {
    case ConnectionType.SqlClient :
    {
    return new SqlDataAdapter();
    }
    case ConnectionType.OleDb :
    {
    return new OleDbDataAdapter();
    }
    default :
    {
    throw new Exception("Error DbDataAdapter");
    }
    }
    }
      

  2.   

    connection、DataAdapter等等,在你的程序页面或窗口中就不要特别申明了,把这些工作封装到一个专门的数据处理类中。实际上是对ADO.NET的二次封装,也就是应用ADO.NET一些常用的功能,让调用者有一个简单的入口和方便的处理。这也是设计模式之一。这个数据处理类应用工厂模式,数据库配置在config文件中。下载DataAccess看看
    www.webmis.com.cn 
      

  3.   

    就用抽像工厂模式,但象System.Data.OracleClient.OracleConnection这样的类都被封装了,不能够实现。
    reaperwu的办法是分别对access和oracle都要去写相应的代码,不同的connection,不同的DataAdapter,在业务层也得去分别写出不同的程序,怎样提高代码重用性。
      

  4.   

    using System;namespace iuhxq
    {
     public abstract class DataProvider
     {
      public abstract string GetDataProvider();
     } public class OleDbDataProvider : DataProvider
     {
      public override string GetDataProvider()
      {
       return "OleDbDataProvider";
      }
     } public class SqlDataProvider : DataProvider
     {
      public override string GetDataProvider()
      {
       return "SqlDataProvider";
      }
     } public class DataProviderFactory
     {
      public static DataProvider GetDataProvider(string ProviderType)
      {
       if (ProviderType.ToLower() == "oledbdataprovider")
       {
        return new OleDbDataProvider();
       }
       else
       {
        return new SqlDataProvider();
       }
      }
     } public class Factory
     {
      public static void Main()
      {
       Console.WriteLine(DataProviderFactory.GetDataProvider("OleDbDataProvider").GetDataProvider());
      }
     }
    }
      

  5.   

    不好意思,刚才没有看清楚eaperwu中提出了的IDbDataAdapter类?这个类是不是对任何数据源都适用?比如无论什么数据源,我的DataGrid就去绑定IDbDataAdapter的数据
      

  6.   

    本人做了一个通用的数据访问类.采用的是简单工厂模式,针对IDbConnection,IDbCommand,IDbDataAdapter编程.可以直接操作sql,oldb,odbc等数据源,更换数据源时不需修改访问层,正如楼上兄弟所说,只需在web.config简单设置即可.原是给我学生做的例子.后来就一直用上了.很方便.压缩后只有30K不到,如有需要留信箱,分享你用.内附有详细说明和源码.
      

  7.   

    [email protected]楼上的,发一个学习学习,谢谢!!
      

  8.   

    后台的数据库操作是没有问题,但具体的SQL语句操作就成大问题了.
    在ORACLE中,它的SQL操作与ACCESS有极大的不同,并且关于超大文本的处理方式也是差别很大.比如说:在ACCESS数据库中,存储大量的文本,可以用备注字段,但在ORACLE中,一般的文本只有存储到4000个字节,超过后只能使用CLOB字段,但CLOB字段的写入方式在一些条件下有很大不同.
    另外,比如在ACCESS里面,提取数据可以使用TOP 10的方式来进行,但在ORACLE中,这种方式不可行.
    另外,调用函数/存储过程等,在ACCESS里面根本没有办法.
    如果你是ACCESS与MS SQLSERVER,问题还少点,但ACCESS与ORACLE两者之间,确实差别很大.建议你不要这样做.
    其实你完全可以在自己的机器上安装一个ORACLE数据库,这并不困难.
      

  9.   

    谢谢,请发一份给我共享一下.
    [email protected]====CSDN 小助手 V2.5 2005年11月05日发布====
    CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
    界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
    下载:http://szlawbook.com/csdnv2
      

  10.   

    flygoldfish(长江支流)果真是高手,谢谢!
      

  11.   

    如果可以就用ASP.NET 2.0,或者至少模仿ASP.NET 2.0所有基础应用都靠Provider的模式,其实ASP.NET 2.0这样做也只是把非常多优秀的ASP.NET 1.x设计模式整合进去了,ASP.NET 1.x也可以这样做,只是得不到Framework和VS的支持。面对Access和Oracle之间的切换,谁都会想把重用范围延伸到SQL语句的,但实际上面对这样的问题为了确保系统的稳定性和模块的完整性最好不要这样做,两个DataProvider都是都是仅暴露C#接口不要暴露能够直接输入SQL的地方,所有SQL都内部生成和处理。至于两个DataProvider内部会有大量重复的SQL这个问题,我建议采用类似多语言的字符串资源的处理机制,也就是好像存放一般字符串资源那样把Access的SQL语句先存放起来,把Access SQL对应为一种语言。迁移时添加一种语言,把Oracle SQL与Access SQL不同的那几条存放进去,读取时优先读取Oracle SQL,不存在的话就直接使用Access SQL。
      

  12.   

    非常感谢“kkeemmgg(意识流) ”,你让我太感动了!
      

  13.   

    如果程序里面只是使用用IDbConnection, IDbCommand和IDbDataAdapter等借口
    使用用工厂模式,这样的话就可以用“借口隔离细节”
    IDbDataAdapter dataAdapter = DatabaseFactory.CreateDbDataAdapter();
    dataAdapter.SelectCommand = command;
    dataAdapter.Fill(dataSet);
      

  14.   

    自己编一个数据库连接类,根据不同的参数选择不同ADO.NET中的类。