我有一个用三层做的asp.net的项目
做的时候是用的sqlserve
可完成好老板要吧数据库该成Oracle的数据库
从新写DAL层数不可能的了
有没有别的方法请各位高手指点?

解决方案 »

  1.   

    用工厂模式,只需要更改web.config的设置和DAL部分的代码就可以了。参考PetShop4.0.
    还可以使用下面的DbHelper类:
      

  2.   

    下面是Ado.net的一个工厂模式的DbHelper:
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.Common;
    using System.Data.OleDb;
    using System.Linq;
    using System.Text;namespace TaxInvionce
    {
        class DbHelper
        {
            private static string dbProviderName = ConfigurationSettings.AppSettings["DbProviderName"];
            //private static string dbp = "Provider=System.Data.OleDb";
            private static string dbConnectionString = ConfigurationManager.AppSettings["TaxInvoiceConn"];        private DbConnection connection;
            public DbHelper()
            {
                this.connection = CreateConnection(DbHelper.dbConnectionString);
            }        public DbHelper(string connectionString)
            {
                this.connection = CreateConnection(connectionString);
            }        public static DbConnection CreateConnection()
            {
                DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
                DbConnection dbconn = dbfactory.CreateConnection();
                dbconn.ConnectionString = DbHelper.dbConnectionString;
                return dbconn;
            }
            public static DbConnection CreateConnection(string connectionString)
            {
                DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
                DbConnection dbconn = dbfactory.CreateConnection();
                dbconn.ConnectionString = connectionString;
                return dbconn;
            }        public DbCommand GetStoredProcCommond(string storedProcedure)
            {
                DbCommand dbCommand = connection.CreateCommand();
                dbCommand.CommandText = storedProcedure;
                dbCommand.CommandType = CommandType.StoredProcedure;
                return dbCommand;
            }
            public DbCommand GetSqlStringCommond(string sqlQuery)
            {
                DbCommand dbCommand = connection.CreateCommand();
                dbCommand.CommandText = sqlQuery;
                dbCommand.CommandType = CommandType.Text;
                return dbCommand;
            }
            #region 增加参数
            public void AddParameterCollection(DbCommand cmd, DbParameterCollection dbParameterCollection)
            {
                foreach (DbParameter dbParameter in dbParameterCollection)
                {
                    cmd.Parameters.Add(dbParameter);
                }
            }
            public void AddOutParameter(DbCommand cmd, string parameterName, DbType dbType, int size)
            {
                DbParameter dbParameter = cmd.CreateParameter();
                dbParameter.DbType = dbType;
                dbParameter.ParameterName = parameterName;
                dbParameter.Size = size;
                dbParameter.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(dbParameter);
            }
            public void AddInParameter(DbCommand cmd, string parameterName, DbType dbType, object value)
            {
                DbParameter dbParameter = cmd.CreateParameter();
                dbParameter.DbType = dbType;
                dbParameter.ParameterName = parameterName;
                dbParameter.Value = value;
                dbParameter.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(dbParameter);
            }
            public void AddReturnParameter(DbCommand cmd, string parameterName, DbType dbType)
            {
                DbParameter dbParameter = cmd.CreateParameter();
                dbParameter.DbType = dbType;
                dbParameter.ParameterName = parameterName;
                dbParameter.Direction = ParameterDirection.ReturnValue;
                cmd.Parameters.Add(dbParameter);
            }
            public DbParameter GetParameter(DbCommand cmd, string parameterName)
            {
                return cmd.Parameters[parameterName];
            }        #endregion
            #region 执行
            public DataSet ExecuteDataSet(DbCommand cmd)
            {
                DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
                DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
                dbDataAdapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
                dbDataAdapter.Fill(ds);
                return ds;
            }        public DataTable ExecuteDataTable(DbCommand cmd)
            {
                DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
                DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
                dbDataAdapter.SelectCommand = cmd;
                DataTable dataTable = new DataTable();
                dbDataAdapter.Fill(dataTable);
                return dataTable;
            }        public DbDataReader ExecuteReader(DbCommand cmd)
            {
                cmd.Connection.Open();
                DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return reader;
            }
            public int ExecuteNonQuery(DbCommand cmd)
            {
                cmd.Connection.Open();
                int ret = cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                return ret;
            }        public object ExecuteScalar(DbCommand cmd)
            {
                cmd.Connection.Open();
                object ret = cmd.ExecuteScalar();
                cmd.Connection.Close();
                return ret;
            }
     
      

  3.   

           #endregion
            #region 执行事务
            public DataSet ExecuteDataSet(DbCommand cmd, Trans t)
            {
                cmd.Connection = t.DbConnection;
                cmd.Transaction = t.DbTrans;
                DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
                DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
                dbDataAdapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
                dbDataAdapter.Fill(ds);
                return ds;
            }        public DataTable ExecuteDataTable(DbCommand cmd, Trans t)
            {
                cmd.Connection = t.DbConnection;
                cmd.Transaction = t.DbTrans;
                DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
                DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
                dbDataAdapter.SelectCommand = cmd;
                DataTable dataTable = new DataTable();
                dbDataAdapter.Fill(dataTable);
                return dataTable;
            }        public DbDataReader ExecuteReader(DbCommand cmd, Trans t)
            {
                cmd.Connection.Close();
                cmd.Connection = t.DbConnection;
                cmd.Transaction = t.DbTrans;
                DbDataReader reader = cmd.ExecuteReader();
                DataTable dt = new DataTable();
                return reader;
            }
            public int ExecuteNonQuery(DbCommand cmd, Trans t)
            {
                cmd.Connection.Close();
                cmd.Connection = t.DbConnection;
                cmd.Transaction = t.DbTrans;
                int ret = cmd.ExecuteNonQuery();
                return ret;
            }        public object ExecuteScalar(DbCommand cmd, Trans t)
            {
                cmd.Connection.Close();
                cmd.Connection = t.DbConnection;
                cmd.Transaction = t.DbTrans;
                object ret = cmd.ExecuteScalar();
                return ret;
            }
            #endregion
        }    public class Trans : IDisposable
        {
            private DbConnection conn;
            private DbTransaction dbTrans;
            public DbConnection DbConnection
            {
                get { return this.conn; }
            }
            public DbTransaction DbTrans
            {
                get { return this.dbTrans; }
            }        public Trans()
            {
                conn = DbHelper.CreateConnection();
                conn.Open();
                dbTrans = conn.BeginTransaction();
            }
            public Trans(string connectionString)
            {
                conn = DbHelper.CreateConnection(connectionString);
                conn.Open();
                dbTrans = conn.BeginTransaction();
            }
            public void Commit()
            {
                dbTrans.Commit();
                this.Colse();
            }        public void RollBack()
            {
                dbTrans.Rollback();
                this.Colse();
            }        public void Dispose()
            {
                this.Colse();
            }        public void Colse()
            {
                if (conn.State == System.Data.ConnectionState.Open)
                {
                    conn.Close();
                }
            }
     
        }
    }
      

  4.   

    参考下PetShop的做法,在IDAL层中加一个简单工厂类。根据在Web.config中的配置决定连什么数据库。
    SqlServer换Oracle只要重新写一个OracleDAL添加到项目中其他的都不用换
      

  5.   

    用加工厂也解决不了所有问题,有些sql、建表脚本还是需要修改的,这是数据库的差异。
      

  6.   

    存储过程。sql的可能需要改。因为语法特性还是有些不同,链接则比较简单了、
    以后就设计成可配置的最好。
      

  7.   

    sql语句要改,除非你都是标准的T-sql
      

  8.   

    换数据层往往不能完全解决,除非你的语句完全按SQL-92标准写的
      

  9.   

    如果使用了ORM的话,就更容易改了!不过ms楼主没有用。
    不过,既然是三层架构,改动的部分应该比较集中,只是稍微麻烦了一点。
      

  10.   

    在连接数据库之前,加一个判断所使用数据库的类型的方法。
    又可以用sql 又可以用Oracle。
    底层数据查询,Orcale的慢慢写哈 加油!!!
      

  11.   

    觉得有些扯
    如果有Unit Test的话, 将DAO/ADO的Test Case都运行一遍
    不能通过的就修改, 针对性的修改不能通过的数据操作类.
      

  12.   

    只有改DAL,既然碰到会用数据库,那干脆用工厂模式...
      

  13.   


    现在很多.NET的框架都有这样的功能的
    我们公司的就有,自己去研究下就能搞清楚了
    不难的但是你说的有的查询是写的SQL的这也是的确很头疼的问题
    而会导致写SQL语句来查询这种原始的方法早就开始被淘汰了
    我们公司的框架也是经常因为有些查询很复杂导致框架拼凑SQL语句的功能不够强大
    于是有的还是要手写SQL语句,于是遇到你这样的问题也是很痛苦的事了
    所以做框架的时候考虑周全点还是很有必要的啊!
      

  14.   

    http://www.c-sharpcorner.com/Code/2002/July/GenericDataProvider.asp里面可能有你要的答案