用C#语言封装一个sqlHelper类,这个最好怎么设计这个类呢?
刚刚学了C#的接口和泛型等,想实现这个一个工具类,但是思路比较混乱,所以想请各位大佬给出一些思路,怎么写便于后期的扩展。
需求:可以处理不同的数据库的CRDU,
         方法:直接传入sql和参数,支持多条sql一起执行

解决方案 »

  1.   

     
     //封装数据库连接字符串
            private static string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();        #region 封装格式化SQL语句执行的各种方法        public static int Update(string sql)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    return cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    //将异常信息写入日志
                    //WriteLog(ex.Message);
                    //throw new Exception("调用public static int Update(string sql)方法时发生错:" + ex.Message);
                    string errorInfo = "调用public static int Update(string sql)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    conn.Close();
                }
            }
            public static object GetSingleResult(string sql)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    return cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    //将异常信息写入日志              
                    string errorInfo = "调用public static object  GetSingleResult(string sql)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    conn.Close();
                }
            }
            public static SqlDataReader GetReader(string sql)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    conn.Close();
                    //将异常信息写入日志              
                    string errorInfo = "调用SqlDataReader GetReader(string sql)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
            }
            public static DataSet GetDataSet(string sql)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);//创建数据适配器对象
                DataSet ds = new DataSet();//创建一个内存数据集
                try
                {
                    conn.Open();
                    da.Fill(ds);//使用数据适配器填充数据集
                    return ds;
                }
                catch (Exception ex)
                {
                    //将异常信息写入日志              
                    string errorInfo = "调用  public static DataSet GetDataSet(string sql)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    conn.Close();
                }
            }
            public static bool UpdateByTran(List<string> sqlList)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                try
                {
                    conn.Open();
                    cmd.Transaction = conn.BeginTransaction();//开启事务          
                    foreach (string sql in sqlList)
                    {
                        cmd.CommandText = sql;
                        cmd.ExecuteNonQuery();
                    }
                    cmd.Transaction.Commit();//提交事务
                    return true;
                }
                catch (Exception ex)
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction.Rollback();//回滚事务
                    }
                    string errorInfo = "调用UpdateByTran(List<string> sqlList)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction = null;//清空事务
                    }
                    conn.Close();
                }
            }        #endregion
        
      

  2.   

       #region 封装带参数SQL语句执行的各种方法        public static int Update(string sql, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Parameters.AddRange(param);//封装参数
                    return cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    string errorInfo = "调用 public static int Update(string sql,SqlParameter[] param)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }
            }
            public static object GetSingleResult(string sql, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Parameters.AddRange(param);//封装参数
                    return cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    //将异常信息写入日志              
                    string errorInfo = "调用 public static object GetSingleResult(string sql, SqlParameter[] param)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    conn.Close();
                }
            }
            public static SqlDataReader GetReader(string sql, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Parameters.AddRange(param);//封装参数
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    conn.Close();
                    //将异常信息写入日志              
                    string errorInfo = "调用 public static SqlDataReader GetReader(string sql, SqlParameter[] param)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
            }
            /// <summary>
            /// 启用事务提交多条带参数的SQL语句
            /// </summary>
            /// <param name="mainSql">主表SQL语句</param>
            /// <param name="mainParam">主表SQL语句对应的参数</param>
            /// <param name="detailSql">明细表SQL语句</param>
            /// <param name="detailParam">明细表SQL语句对应的参数数组集合</param>
            /// <returns>返回事务是否执行成功</returns>
            public static bool UpdateByTran(string mainSql, SqlParameter[] mainParam,
                string detailSql, List<SqlParameter[]> detailParam)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                try
                {
                    conn.Open();
                    cmd.Transaction = conn.BeginTransaction();//开启事务
                    if (mainSql != null && mainSql.Length != 0)
                    {
                        cmd.CommandText = mainSql;
                        cmd.Parameters.AddRange(mainParam);
                        cmd.ExecuteNonQuery();
                    }
                    foreach (SqlParameter[] param in detailParam)
                    {
                        cmd.CommandText = detailSql;
                        cmd.Parameters.Clear();//必须要清除以前的参数
                        cmd.Parameters.AddRange(param);
                        cmd.ExecuteNonQuery();
                    }
                    cmd.Transaction.Commit();//提交事务
                    return true;
                }
                catch (Exception ex)
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction.Rollback();//回滚事务
                    }
                    string errorInfo = "调用  public static bool UpdateByTran(string mainSql, SqlParameter[] mainParam, string detailSql, List<SqlParameter[]> detailParam)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction = null;//清空事务
                    }
                    conn.Close();
                }
            }        #endregion        #region 封装调用存储过程执行的各种方法        public static int UpdateByProcedure(string spName, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(spName, conn);
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;//声明当前操作是存储过程
                    cmd.Parameters.AddRange(param);//封装参数
                    return cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    string errorInfo = "调用 public static int UpdateByProcedure(string spName, SqlParameter[] param)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    conn.Close();
                }
            }
            public static object GetSingleResultByProcedure(string spName, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(spName, conn);
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddRange(param);//封装参数
                    return cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    //将异常信息写入日志              
                    string errorInfo = "调用 public static object GetSingleResult(string sql, SqlParameter[] param)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    conn.Close();
                }
            }
            public static SqlDataReader GetReaderByProcedure(string spName, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(spName, conn);
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddRange(param);//封装参数
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    conn.Close();
                    //将异常信息写入日志              
                    string errorInfo = "调用 public static SqlDataReader GetReader(string sql, SqlParameter[] param)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
            }
            /// <summary>
            /// 启用事务调用带参数的存储过程
            /// </summary>
            /// <param name="procedureName">存储过程名称</param>
            /// <param name="paramArray">存储过程参数数组集合</param>
            /// <returns>返回基于事务的存储过程调用是否成功</returns>
            public static bool UpdateByTran(string procedureName, List<SqlParameter[]> paramArray)
            {
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;//声明当前操作是调用存储过程
                    cmd.CommandText = procedureName;
                    cmd.Transaction = conn.BeginTransaction();//开启事务             
                    foreach (SqlParameter[] param in paramArray)
                    {
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddRange(param);
                        cmd.ExecuteNonQuery();
                    }
                    cmd.Transaction.Commit();//提交事务
                    return true;
                }
                catch (Exception ex)
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction.Rollback();//回滚事务
                    }
                    string errorInfo = "调用 public static bool UpdateByTran(string procedureName,List<SqlParameter[]>paramArray)方法时发生错:" + ex.Message;
                    WriteLog(errorInfo);
                    throw new Exception(errorInfo);
                }
                finally
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction = null;//清空事务
                    }
                    conn.Close();
                }
            }        #endregion
      

  3.   

    http://www.50ak.com/model.html
      

  4.   

    域层
      虽然还没有正式宣布淘汰,但DataSet对大部分开发人员来说已经是过去式了。并不是DataSet的设计有毛病,只是十年的时间在软件行业真的是太长了。技术的步伐就是这样的,10年前令人信服的解决方案在下一个十年很难产生相同的效用。如今,实体框架-----更不用提Nhibernate和其他商业性解决方案---已经能快速创建一个基本的域模型,围绕他来设计你的应用程序了。可以利用实体框架和他的vs工具来创建实体和关系,并使它们呈现出在应用程序的眼中真实数据库的模样。你不需要成为域驱动设计大师,也可以保持数据库详细信息不同于用来实现业务操作的对象.
       可以用对象、关系映射器工具,将实体模型持久保存.
       这将使你具有一个带有填充数据和行为的poco类的程序集.此对象模型代表了你在应用程序后端所拥有的数据模型。让具有描述性属性的类,比如Customer,
    在逻辑上等效与某些数据库列:Name.此外,CUsomter类可能会有大量验证对象状态的方法,并实现特定于对象与实例相关连的属性值上的操作。
      

  5.   

      更加面向业务的行为,比如检查客户的信用状况或者验证客户是否下了足够多的订单以
    获得高水平的服务或奖励。并且更主要的是,那些生产或操作跨多个实体且需要访问数据库的聚合数据的功能。这些都是限于域实体
    和持久性的编排的特殊形式,需要你通过另一个称为域服务的类集合来实现它们。你可能有用于各个重要实体的域服务组件,或者用·DDD术语
    来说,用于各个聚合根的域服务组件。域模型和域服务组成了域层,
      

  6.   

    Dapper直接用就行了,源代码可以直接下载
      

  7.   

    sqlHelper现在用得很少了,建议用EF等ORM