用C#语言封装一个sqlHelper类,这个最好怎么设计这个类呢?
刚刚学了C#的接口和泛型等,想实现这个一个工具类,但是思路比较混乱,所以想请各位大佬给出一些思路,怎么写便于后期的扩展。
需求:可以处理不同的数据库的CRDU,
方法:直接传入sql和参数,支持多条sql一起执行
刚刚学了C#的接口和泛型等,想实现这个一个工具类,但是思路比较混乱,所以想请各位大佬给出一些思路,怎么写便于后期的扩展。
需求:可以处理不同的数据库的CRDU,
方法:直接传入sql和参数,支持多条sql一起执行
//封装数据库连接字符串
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
{
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
虽然还没有正式宣布淘汰,但DataSet对大部分开发人员来说已经是过去式了。并不是DataSet的设计有毛病,只是十年的时间在软件行业真的是太长了。技术的步伐就是这样的,10年前令人信服的解决方案在下一个十年很难产生相同的效用。如今,实体框架-----更不用提Nhibernate和其他商业性解决方案---已经能快速创建一个基本的域模型,围绕他来设计你的应用程序了。可以利用实体框架和他的vs工具来创建实体和关系,并使它们呈现出在应用程序的眼中真实数据库的模样。你不需要成为域驱动设计大师,也可以保持数据库详细信息不同于用来实现业务操作的对象.
可以用对象、关系映射器工具,将实体模型持久保存.
这将使你具有一个带有填充数据和行为的poco类的程序集.此对象模型代表了你在应用程序后端所拥有的数据模型。让具有描述性属性的类,比如Customer,
在逻辑上等效与某些数据库列:Name.此外,CUsomter类可能会有大量验证对象状态的方法,并实现特定于对象与实例相关连的属性值上的操作。
获得高水平的服务或奖励。并且更主要的是,那些生产或操作跨多个实体且需要访问数据库的聚合数据的功能。这些都是限于域实体
和持久性的编排的特殊形式,需要你通过另一个称为域服务的类集合来实现它们。你可能有用于各个重要实体的域服务组件,或者用·DDD术语
来说,用于各个聚合根的域服务组件。域模型和域服务组成了域层,