通用数据库访问我的理解是这样子:  建一个数据工厂类 DataAccessFactory   ,然后建一个数据访问接口类IDBDataAccess
  再建立一个 sql访问的类MSSqlDataAccess和 oracle 访问的类OracleOdbcDataAccess 这两个类均继承自接口IDBDataAccess程序如何调用:
  首先new DataAccessFactory() 后取得ConnectionString 和类型 
 
  如果是MSSQLServer则
   IDBDataAccess db= new MSSqlDataAccess(ConnectionString);  如果是OracleOdbcDataAccess则
   IDBDataAccess db= new OracleOdbcDataAccess(ConnectionString);更换数据库时只须改一下Web.Config文件即可.
在每个业务层上只须加三行代码就可以实现通用访问:
DataAccessFactory df= new DataAccessFactory() ; 
IDBDataAccess db= new MSSqlDataAccess(ConnectionString); 根据df对象创建相应的对象, 默认是sql
db.ExecuteNonQuery("在这里写sql语句");
通用数据访问给我的想法是:
  1、可能会降低访问速度,也就是影响性能,这种方法能否应用在大型的项目开发中?
   2、须事先写好访问SQL和ORACLE的方法
我刚接触aps.net开发,有哪里说的不对的请高手多多指教!不知各位大哥大姐们在开发中数据库访问是如何做的?给点思路我学习一个可以吗?最好给些代码或例子。

解决方案 »

  1.   


    //引入命名空间
    using System.Data.SqlClient;/// <summary>
    /// SqlHelper 的摘要说明
    /// </summary>
    public class SqlHelper
    {
        private static readonly string sqlcon = ConfigurationManager.ConnectionStrings["enterpriseCon"].ConnectionString;    //建立连接方法
        public SqlConnection createCon()
        {
            SqlConnection con = new SqlConnection(sqlcon);
            if (con.State != ConnectionState.Open)
                con.Open();
            return con;
        }
        //准备command命令
        public static void prepareCommand(SqlConnection con, SqlCommand cmd, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] para)
        {
            //如果数据库连接没有打开  则打开连接
            if (con.State != ConnectionState.Open)
            {
                con.Open();
            }
            cmd.Connection = con;
            cmd.CommandText = cmdText;
            if (trans != null)//如果trans存在的话 执行以下命令
            {
                cmd.Transaction = trans;
            }
            cmd.CommandText = cmdText;
            if (para != null)//如果para不为空 遍历一遍para
            {
                foreach (SqlParameter pa in para)
                {
                    cmd.Parameters.Add(pa);
                }
            }
        }    //从数据库中读取数据源 返回一个SqlDataReader对象
        public static SqlDataReader executeReader(string cmdText, CommandType cmdType, SqlParameter[] para)
        {
            //定义连接
            SqlConnection con = new SqlConnection(sqlcon);
            //捕获可能发生的异常
            try
            {
                SqlCommand cmd = new SqlCommand();
                prepareCommand(con, cmd, null, cmdType, cmdText, para);            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return sdr;
            }
            catch (Exception)
            {
                throw;
            }
        }    //更新数据库方法(增加,删除)
        public static int executeNonQuery(string cmdText, CommandType cmdType, SqlParameter[] para)
        {
            using (SqlConnection con = new SqlConnection(sqlcon))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    prepareCommand(con, cmd, null, cmdType, cmdText, para);
                    int result = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    return result;
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }    //取得数据库中一行的值
        public static string executeScalar(string cmdText, CommandType cmdType, SqlParameter[] para)
        {
            using (SqlConnection con = new SqlConnection(sqlcon))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    prepareCommand(con, cmd, null, cmdType, cmdText, para);
                    string result = Convert.ToString(cmd.ExecuteScalar());
                    cmd.Parameters.Clear();
                    return result;
                }
                catch (Exception)
                {                throw;
                }
            }
        }    //DataSet
        public static DataSet executeDataAdapter(string cmdText,CommandType cmdType,SqlParameter[] para) {
            using (SqlConnection con=new SqlConnection(sqlcon))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    prepareCommand(con, cmd, null, cmdType, cmdText, para);
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    sda.Fill(ds);
                    cmd.Parameters.Clear();
                    return ds;
                }
                catch (Exception)
                {
                    throw;
                }
            }    
        }
    }
      

  2.   


    //
     1、可能会降低访问速度,也就是影响性能,这种方法能否应用在大型的项目开发中?//一定是会影响性能的,因为用到了反射Reflection技术,但这不足以影响在大项目中的应用! 
     2、须事先写好访问SQL和ORACLE的方法//不需要,只写好你要用的数据库即可,实际上,我们这样做,只是为了以后采用其它数据库方便一些,其实,在已经创建的应用中更换数据库的可能性并不大,而是一开始就决策好了的!
      

  3.   

    建议LZ学习一下微软的ApplicationBlock.DataAccess
      

  4.   

    1、可能会降低访问速度,也就是影响性能,这种方法能否应用在大型的项目开发中?
    ----------------------------------------
    你的理由是??2、须事先写好访问SQL和ORACLE的方法 
    ----------------------------------------
    这是为什么?你什么不许写任何实现,直接使用接口就可进行其它开发。
      

  5.   

    多谢各位楼上的指点。
    写通用数据库访问最主要是解决增加参数问题,MSSqlDataAccess类中,定义一个变量 Cmd,在创建实例时Cmd = new SqlCommand(); 下面是增加参数的代码:   #region int
            /// <summary>
            /// 添加int型的参数。
            /// </summary>
            /// <param name="ParameterName">参数名称。比如 @UserName</param>
            /// <param name="ParameterValue">参数值</param>
            public void addNewParameter(string ParameterName, int ParameterValue)
            {
                Cmd.Parameters.Add(ParameterName, SqlDbType.Int, 4); //添加存储过程的参数
                Cmd.Parameters[ParameterName].Value = ParameterValue; //赋值
                //设置方向取默认值——输入
            }
            #endregion        #region double
            /// <summary>
            /// 添加小数参数,double
            /// </summary>
            /// <param name="ParameterName">参数名称。比如 @UserName</param>
            /// <param name="ParameterValue">参数值</param>
            public void addNewParameter(string ParameterName, double ParameterValue)
            {
                Cmd.Parameters.Add(ParameterName, SqlDbType.Float); //添加存储过程的参数
                Cmd.Parameters[ParameterName].Value = ParameterValue; //赋值
            }
            #endregion        #region decimal
            /// <summary>
            /// 添加金额参数,方向是输入(input)。decimal
            /// </summary>
            /// <param name="ParameterName">参数名称。比如 @UserName</param>
            /// <param name="ParameterValue">参数值</param>
            public void addNewParameter(string ParameterName, decimal ParameterValue)
            {
                Cmd.Parameters.Add(ParameterName, SqlDbType.Decimal); //添加存储过程的参数
                Cmd.Parameters[ParameterName].Value = ParameterValue; //赋值
            }
            #endregion        #region nvarChar
            /// <summary>
            /// 添加nvarChar型的参数。方向是输入(input)
            /// </summary>
            /// <param name="ParameterName">参数名称。比如 @UserName</param>
            /// <param name="ParameterValue">参数值</param>
            /// <param name="size">参数大小</param>
            public void addNewParameter(string ParameterName, string ParameterValue, int size)
            {
                Cmd.Parameters.Add(ParameterName, SqlDbType.NVarChar, size); //添加存储过程的参数
                Cmd.Parameters[ParameterName].Value = ParameterValue; //赋值
            }
            #endregion
    ……
    ……