是这样的:之前我们公司有.NET(C#)一个项目,该项目是三层结构(UI层\业务逻辑层\数据访问层),访问数据库是基于SQL SERVER2000,那么大家都知道,在C#中访问数据库的提成程序是:SqlClient提供的SqlConnection\SqlDataReader\SqlCommand\SqlDataAdapter等对象,但是我们打算做成一套通过修改Web.config的数据库连接串后就根据连接什么类型的数据库,就能进行访问.比如访问MS Access,使用提供程序是OleDb下的访问对象.但是如何修改不同连接数据库字符串后相应的命名空间相应改变.谢谢

解决方案 »

  1.   

    这个早有现成的了.比如微软的DataAccess application Block 3.0,Enterprise Library1.x ,2.0另外你还可以使用o/r mapping,比如NHibernate,选择太多了.
      

  2.   

    谢谢jiezhi(风满袖),不过你可能还没有理解我的本意:
    比如下面的代码,是一个类的一个方案1(访问SqlServer2000)修改成方案2(访问MS ACCESS)
    #region 查看 分所 SqlDataReader
    /// <summary>
    /// 查看 分所
    /// </summary>
    /// <param name="ID"></param>
    /// <returns></returns>
    public SqlDataReader GetCompany(int ID)
    {
         string sql = " select * from Organ_Company where ID="+ID;
         return SqlHelper.ExecuteReader(DBConnString,CommandType.Text,sql);
    }#endregion方案2:
    #region 查看 分所 OleDbDataReader 
    /// <summary>
    /// 查看 分所
    /// </summary>
    /// <param name="ID"></param>
    /// <returns></returns>
    public OleDbDataReader GetCompany(int ID)
    {
    string sql = " select * from Organ_Company where ID="+ID;
    return OleDbHelper.ExecuteReader(DBConnString,CommandType.Text,sql);
    }#endregion
    这样修改后,UI层当调用GetCompany( id )方法后返回的是DataReader,问题就是在于如何决定是SqlDataReader,还是OleDbDataReader呢?(SqlHelper\OleDbHelper都已经做好)这个时候我应该如何重构?因为这个项目之前没有考虑到扩展切换数据库,所以没有什么接口.现在又不想面目全非地改变软件内部结构,现在如何才能做到如上的需求,而又不至于面目全非地修改软件内部结构呢?恳请好心人给予帮助,小弟不胜感激你~~~~~!!!
      

  3.   

    我也遇到过这样的问题,我目前写的只支持oracle和sql server ,在连接字符串中,人为规定默认为sql数据库,如果是oracle的话前面就加个oracle:这样我在封装的数据库类中就可以加标记判断了,还有我自己写了个DataReader类,根据上面的标记自动返回SqlDataReader和oracleDataReader.
      

  4.   

    加载那一个类可以判断connectionstring里的特定字符,比如sqloledb等
    返回的sqlconnection等对象使用统一的接口,比如dotnet提供的IConnection, ICommand等,其他的类自己写公共接口就可以了
      

  5.   

    去微软社区去找一下“Enterprise Library"吧,它能满足你对数据库的要求,就是你只需要设置而不用更改哪怕一行原代码,就能实现与不同的数据库相连
      

  6.   

    你可以根据config来说明,来声明不同的dbconnection和其他数据操作对象,而对于每个表大部分的sql语句也基本上是一致。所以对于不同的数据库进行操作,主要在于如何根据config来说明,来声明不同的dbconnection和其他数据操作对象这一点上。
      

  7.   

    一句两句说不明白,自己去看微软的例子
    Petshop,里面是用工厂模式以及反射实现的
      

  8.   

    谢谢各位大虾~~~~~小弟只能在此对各位的帮助表示感谢~~~今天一定给大家结贴的!!!TO charles_y(难得糊涂) 大虾:我对Petshop也有一点研究,看来你对Petshop一定有高深的见解,小弟在此想请教你一个让我疑惑的问题:Petshop的数据库只有几张表,然后在Petshop项目里面也相应做成数据实体类,属性和表的字段相对应,我知道也是面向对象的一种好方法.那么让我疑惑的是:如果Petshop数据库里面的表突然增多到100张,甚至几百张表的时候,那么,按照Petshop的思想,应该创建和数据库表那么多的数据实体类吗?如果是,那么会对项目维护管理是不是带来不方便呢?或者说在内存new 的对象太多的话,会造成内存紧张吗?谢谢~~~~~~~也希望各位大虾给小弟解决这个让我疑惑好久的疑问~~~谢谢了!!!!
      

  9.   

    谢谢各位大虾~~~~~小弟只能在此对各位的帮助表示感谢~~~今天一定给大家结贴的!!!TO charles_y(难得糊涂) 大虾:我对Petshop也有一点研究,看来你对Petshop一定有高深的见解,小弟在此想请教你一个让我疑惑的问题:Petshop的数据库只有几张表,然后在Petshop项目里面也相应做成数据实体类,属性和表的字段相对应,我知道也是面向对象的一种好方法.那么让我疑惑的是:如果Petshop数据库里面的表突然增多到100张,甚至几百张表的时候,那么,按照Petshop的思想,应该创建和数据库表那么多的数据实体类吗?如果是,那么会对项目维护管理是不是带来不方便呢?或者说在内存new 的对象太多的话,会造成内存紧张吗?谢谢~~~~~~~也希望各位大虾给小弟解决这个让我疑惑好久的疑问~~~谢谢了!!!!