public class DBHelper:IDisposable { /// <summary> /// 连接字符串 /// </summary> private string connString { get; set; } public DBHelper() { this.connString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; } public DBHelper(string connectionString) { this.connString = connectionString; } /// <summary> /// 得到一个连接 /// </summary> public SqlConnection GetConn() { SqlConnection conn = new SqlConnection(this.connString); conn.Open(); return conn; } /// <summary> /// 获取一个DataReader /// </summary> /// <param name="sql">sql语句</param> /// <returns></returns> public SqlDataReader GetDataReader(string sql) { using (SqlCommand cmd = new SqlCommand(sql, GetConn())) { return cmd.ExecuteReader(CommandBehavior.CloseConnection); } } /// <summary> /// 获取一个DataReader,带参数 /// </summary> /// <param name="sql">sql语句</param> /// <returns></returns> public SqlDataReader GetDataReader(string sql, SqlParameter[] param) { using (SqlCommand cmd = new SqlCommand(sql, GetConn())) { if (param != null && param.Length > 0) cmd.Parameters.AddRange(param); SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return dr; } } /// <summary> /// 获取一个DataTable /// </summary> /// <param name="sql">sql语句</param> /// <returns></returns> public DataTable GetDataTable(string sql) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { using (SqlDataAdapter Dap = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); Dap.Fill(dt); cmd.Parameters.Clear(); return dt; } } } } /// <summary> /// 获取一个DataTable,带参数 /// </summary> /// <param name="sql">sql语句</param> /// <returns></returns> public DataTable GetDataTable(string sql, SqlParameter[] param) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (param != null && param.Length > 0) cmd.Parameters.AddRange(param); using (SqlDataAdapter Dap = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); Dap.Fill(dt); cmd.Parameters.Clear(); return dt; } } } } /// <summary> /// 执行SQL /// </summary> /// <param name="sql"></param> /// <returns></returns> public int Execute(string sql) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { return cmd.ExecuteNonQuery(); } } } /// <summary> /// 执行SQL(事务) /// </summary> /// <param name="sql"></param> /// <returns></returns> public int Execute(Dictionary<string, SqlParameter[]> sqlList) { using (SqlConnection conn = GetConn()) { int i = 0; SqlTransaction trans = conn.BeginTransaction(); try { using (SqlCommand cmd = new SqlCommand()) { foreach (var sql in sqlList) { cmd.Connection = conn; cmd.CommandText = sql.Key; if (sql.Value != null && sql.Value.Length > 0) cmd.Parameters.AddRange(sql.Value.ToArray()); i += cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } } trans.Commit(); return i; } catch (SqlException err) { trans.Rollback(); throw new Exception(err.Message); } } } /// <summary> /// 执行SQL(事务) /// </summary> /// <param name="sql"></param> /// <returns></returns> public string ExecuteScalar(Dictionary<string, SqlParameter[]> sqlList) { using (SqlConnection conn = GetConn()) { object value = null; SqlTransaction trans = conn.BeginTransaction(); try { using (SqlCommand cmd = new SqlCommand()) { foreach (var sql in sqlList) { cmd.Connection = conn; cmd.CommandText = sql.Key; if (sql.Value != null && sql.Value.Length > 0) cmd.Parameters.AddRange(sql.Value.ToArray()); value = cmd.ExecuteScalar(); cmd.Parameters.Clear(); } } trans.Commit(); return value != null ? value.ToString() : string.Empty; } catch (SqlException err) { trans.Rollback(); throw new Exception(err.Message); } } } /// <summary> /// 执行带参数的SQL /// </summary> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public int Execute(string sql, SqlParameter[] param) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(param); int r = -1; r = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return r; } } } /// <summary> /// 执行带参数的SQL /// </summary> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public string ExecuteScalar(string sql, SqlParameter[] param) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(param); string r = string.Empty; object obj = cmd.ExecuteScalar(); r = obj != null ? obj.ToString() : string.Empty; cmd.Parameters.Clear(); return r; } } } /// <summary> /// 执行带参数的SQL /// </summary> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public int Execute(string sql, SqlParameter[] param, out int identity) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (param != null && param.Length > 0) cmd.Parameters.AddRange(param); int i = cmd.ExecuteNonQuery(); SqlCommand cmd1 = new SqlCommand("SELECT @@IDENTITY", conn); object MaxIDObject = cmd1.ExecuteScalar(); int MaxID; identity = MaxIDObject != null && int.TryParse(MaxIDObject.ToString(), out MaxID) ? MaxID : -1; cmd1.Dispose(); cmd.Parameters.Clear(); return i; } } } /// <summary> /// 得到一个字段的值 /// </summary> /// <param name="sql"></param> /// <returns></returns> public string GetFieldValue(string sql) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return obj != null ? obj.ToString() : string.Empty; } } } /// <summary> /// 得到一个字段的值,带参数 /// </summary> /// <param name="sql"></param> /// <returns></returns> public string GetFieldValue(string sql, SqlParameter[] param) { using (SqlConnection conn = GetConn()) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { if (param != null && param.Length > 0) cmd.Parameters.AddRange(param); object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return obj != null ? obj.ToString() : string.Empty; } } } /// <summary> /// 释放数据库连接 /// </summary> public void Dispose() { if (new SqlConnection(this.connString) is SqlConnection) { if (new SqlConnection(this.connString) != null && new SqlConnection(this.connString).State != ConnectionState.Closed) { try { new SqlConnection(this.connString).Close(); } catch (SqlException err) { } } new SqlConnection(this.connString).Dispose(); } } }
/// <summary> /// 数据处理辅助累,包含增删改查! /// </summary> public class DBCom { public DBCom() { } private List<Dictionary<string, object>> Getproperties<T>() { System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); var ts = typeof(T); Dictionary<string, object> dicatpk = new Dictionary<string, object>(); Dictionary<string, object> dicpk = new Dictionary<string, object>(); foreach (System.Reflection.PropertyInfo item in properties) { string name = item.Name; var pName = ts.GetProperty(name); var attrs = pName.GetCustomAttributes(true); string DisplayName = ""; foreach (DisplayNameAttribute attr in attrs) { DisplayName = attr.DisplayName; } if (DisplayName.ToLower().Equals("atpk")) { dicatpk.Add(name, ""); } if (DisplayName.ToLower().Equals("pk")) { dicpk.Add(name, ""); } } List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); list.Add(dicatpk); list.Add(dicpk); return list; } private List<Dictionary<string, object>> Getproperties<T>(T t) { System.Reflection.PropertyInfo[] properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); var ts = typeof(T); Dictionary<string, object> dic = new Dictionary<string, object>(); Dictionary<string, object> dicatpk = new Dictionary<string, object>(); Dictionary<string, object> dicpk = new Dictionary<string, object>(); foreach (System.Reflection.PropertyInfo item in properties) { string name = item.Name; object value = item.GetValue(t, null); var pName = ts.GetProperty(name); var attrs = pName.GetCustomAttributes(true); string DisplayName = ""; foreach (DisplayNameAttribute attr in attrs) { DisplayName = attr.DisplayName; } if (value != null && !DisplayName.ToLower().Equals("atpk")) { dic.Add(name, value); } if (DisplayName.ToLower().Equals("atpk")) { dicatpk.Add(name, value); } if (DisplayName.ToLower().Equals("pk")) { dicpk.Add(name, value); } } List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); list.Add(dic); list.Add(dicatpk); list.Add(dicpk); return list; } /// <summary> /// 根据实体向数据库中添加数据 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="t">实体</param> /// <returns>影响记录数</returns> public int Add<T>(T t) { var list = Getproperties<T>(t); if (list.Count > 0) { var ts = typeof(T); var dic = list[0]; string tStr = "insert into " + ts.Name + " ("; foreach (var item in dic) { tStr += string.Format("{0}", item.Key) + ","; } tStr = tStr.TrimEnd(',') + ") values ("; foreach (var item in dic) { tStr += string.Format("{0}", "@" + item.Key) + ","; } tStr = tStr.TrimEnd(',') + ") ;"; List<SqlParameter> listPM = new List<SqlParameter>(); foreach (var item in dic) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } return new DBHelper().Execute(tStr, listPM.ToArray()); } else { throw new Exception("没找到数据表"); } } /// <summary> /// 多条件修改实体内容 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="t">实体</param> /// <param name="wkey">修改数据必须满足的字段,用 , 隔开例: id,name</param> /// <returns>影响行数</returns> public int Update<T>(T t,string wkey) { var list = Getproperties<T>(t); if (list.Count > 0) { var ts = typeof(T); var dic = list[0]; string tStr = "UPDATE " + ts.Name + " SET "; foreach (var item in dic) { tStr += string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key) + ","; } tStr = tStr.TrimEnd(','); string where = " 1=1 "; if(wkey!=null){ var skey = wkey.Split(','); foreach (var item in skey) { foreach (var idic in dic) { if (idic.Key.ToLower().Equals(item.Trim().ToLower())) { where += " and " + string.Format("{0}", idic.Key) + "=" + string.Format("{0}", "@" + idic.Key); } } } } tStr += " where " + where + ";"; List<SqlParameter> listPM = new List<SqlParameter>(); foreach (var item in dic) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } if (list.Count > 1) { foreach (var item in list[1]) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } } return new DBHelper().Execute(tStr, listPM.ToArray()); } else { throw new Exception("没找到数据表"); } } /// <summary> /// 根据主键修改实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="t">实体</param> /// <returns>影响记录数</returns> public int Update<T>(T t) { var list = Getproperties<T>(t); if (list.Count > 0) { var ts = typeof(T); var dic = list[0]; string tStr = "UPDATE " + ts.Name + " SET "; foreach (var item in dic) { tStr += string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key) + ","; } tStr = tStr.TrimEnd(','); string where = " 1=1 "; if (list.Count > 1) { foreach (var item in list[1]) { where += " and " + string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key); } } if (list.Count > 2) { foreach (var item in list[2]) { where += " and " + string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key); } } tStr += " where " + where + ";"; List<SqlParameter> listPM = new List<SqlParameter>(); foreach (var item in dic) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } if (list.Count > 1) { foreach (var item in list[1]) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } } return new DBHelper().Execute(tStr, listPM.ToArray()); } else { throw new Exception("没找到数据表"); } } /// <summary> /// 根据主键删除实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="pk">主键</param> /// <returns>影响行数</returns> public int Delete<T>(object pk) { var list = Getproperties<T>(); var ts = typeof(T); string tStr = "delete from " + ts.Name; string where = " 1=1 "; if (list.Count > 0) { foreach (var item in list[0]) { where += " and " + string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key); } } if (list.Count > 1) { foreach (var item in list[1]) { where += " and " + string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key); } } tStr += " where " + where + ";"; List<SqlParameter> listPM = new List<SqlParameter>(); if (list.Count > 0) { foreach (var item in list[0]) { listPM.Add(new SqlParameter("@" + item.Key, pk)); } } if (list.Count > 1) { foreach (var item in list[1]) { listPM.Add(new SqlParameter("@" + item.Key, pk)); } } return new DBHelper().Execute(tStr, listPM.ToArray()); } /// <summary> /// 根据满足的实体字段删除实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="t">实体数据</param> /// <param name="wkey">删除数据必须满足的字段,用 , 隔开例: id,name</param> /// <returns>影响行数</returns> public int Delete<T>(T t, string wkey) { var list = Getproperties<T>(t); if (list.Count > 0) { var ts = typeof(T); var dic = list[0]; string tStr = "delete from " + ts.Name + " "; tStr = tStr.TrimEnd(','); string where = " 1=1 "; if (wkey != null) { var skey = wkey.Split(','); foreach (var item in skey) { foreach (var idic in dic) { if (idic.Key.ToLower().Equals(item.Trim().ToLower())) { where += " and " + string.Format("{0}", idic.Key) + "=" + string.Format("{0}", "@" + idic.Key); } } } } tStr += " where " + where + ";"; List<SqlParameter> listPM = new List<SqlParameter>(); foreach (var item in dic) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } if (list.Count > 1) { foreach (var item in list[1]) { listPM.Add(new SqlParameter("@" + item.Key, item.Value)); } } return new DBHelper().Execute(tStr, listPM.ToArray()); } else { throw new Exception("没找到数据表"); } } /// <summary> /// 获取当前实体对应表的所有记录 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="names">查询的字段,隔开 例如:id,name</param> /// <param name="order">排序 例如:id desc</param> /// <returns>实体集合</returns> public List<T> GetAll<T>(string names = "*", string order = "") { var list = Getproperties<T>(); var ts = typeof(T); string tStr = "select " + names + " from " + ts.Name; string orderby = " "; if (order.Trim().Length > 3) { orderby = " order by " + order; } tStr += orderby + ";"; return ToList<T>(new DBHelper().GetDataTable(tStr)); } /// <summary> /// 根据主键返回一个实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="pk">主键值</param> /// <param name="names">查询的字段,隔开 例如:id,name</param> /// <returns>一个实体</returns> public T GetOne<T>(object pk, string names = "*") where T : new() { var list = Get<T>(pk, names); if (list != null) { return list[0]; } else { return new T(); } } /// <summary> /// 根据主键返回一个实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="pk">主键值</param> /// <param name="names">查询的字段,隔开 例如:id,name</param> /// <returns>一个实体集合</returns> public List<T> Get<T>(object pk, string names = "*") { var list = Getproperties<T>(); var ts = typeof(T); string tStr = "select " + names + " from " + ts.Name; string where = " 1=1 "; if (list.Count > 0) { foreach (var item in list[0]) { where += " and " + string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key); } } if (list.Count > 1) { foreach (var item in list[1]) { where += " and " + string.Format("{0}", item.Key) + "=" + string.Format("{0}", "@" + item.Key); } } tStr += " where " + where + ";"; List<SqlParameter> listPM = new List<SqlParameter>(); if (list.Count > 0) { foreach (var item in list[0]) { listPM.Add(new SqlParameter("@" + item.Key, pk)); } } if (list.Count > 1) { foreach (var item in list[1]) { listPM.Add(new SqlParameter("@" + item.Key, pk)); } } return ToList<T>(new DBHelper().GetDataTable(tStr, listPM.ToArray())); } /// <summary> /// 根据sql返回一个实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="Sql">sql语句</param> /// <param name="listPM">sql参数</param> /// <returns>实体集合</returns> public List<T> GetSql<T>(string Sql,List<SqlParameter> listPM) { return ToList<T>(new DBHelper().GetDataTable(Sql, listPM.ToArray())); } /// <summary> /// 根据sql返回一个实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="Sql">sql语句</param> /// <returns>实体集合</returns> public List<T> GetSql<T>(string Sql) { return ToList<T>(new DBHelper().GetDataTable(Sql)); } /// <summary> /// DataTable转换为实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="dt">DataTable</param> /// <returns>实体集合</returns> public static List<T> ToList<T>(DataTable dt) { if (dt == null || dt.Rows.Count == 0) { return new List<T>(); } List<T> mList = new List<T>(); PropertyInfo[] pInfos = typeof(T).GetProperties(); foreach (DataRow dr in dt.Rows) { T model = (T)Activator.CreateInstance(typeof(T)); foreach (PropertyInfo info in pInfos) { try { if (dr[info.Name] == DBNull.Value) { continue; } } catch { continue; } try { info.SetValue(model, dr[info.Name], null); } catch { try { var FullName = info.PropertyType.FullName; if (FullName.Contains("String")) { info.SetValue(model, dr[info.Name].ToString(), null); } else if (FullName.Contains("Int32")) { info.SetValue(model, Convert.ToInt32(dr[info.Name]), null); } else if (FullName.Contains("Int64")) { info.SetValue(model, Convert.ToInt64(dr[info.Name]), null); } else if (FullName.Contains("Decimal")) { info.SetValue(model, Convert.ToDecimal(dr[info.Name]), null); } else if (FullName.Contains("Double")) { info.SetValue(model, Convert.ToDouble(dr[info.Name]), null); } else if (FullName.Contains("Single")) { info.SetValue(model, Convert.ToSingle(dr[info.Name]), null); } else if (FullName.Contains("DateTime")) { info.SetValue(model, Convert.ToDateTime(dr[info.Name]), null); } else if (FullName.Contains("Guid")) { info.SetValue(model, new Guid(dr[info.Name].ToString()), null); } else { info.SetValue(model, dr[info.Name].ToString(), null); } } catch (Exception ex) { throw new Exception(dr.Table.Columns[info.Name].ColumnName + "(" + info.PropertyType.Name + ")" + "=" + dr[info.Name] + "=" + ex.Message); } } } mList.Add(model); } return mList; } }
//用法新建一个实体,继承辅助类即可
/// <summary> /// cProject 的摘要说明 /// </summary> [Serializable] public class Project: DBCom { public Project() { // // TODO: 在此处添加构造函数逻辑 // } [DisplayName("pk")]//主键pk 自增主键atpk public int id { get; set; } public string projectName { get; set; } public string tagCode { get; set; } }
//在要使用得地方调用
var project = new Project(); project.projectName = "xx"; project.Add<Project>(project); project.Update<Project>(project); project=project.GetOne<Project>(1); var list0=project.GetAll<Project>(); var list1=project.Get<Project>(1); var list2=project.GetSql<Project>("select id from Project");//如果只需要填装部分字段 只需查出需要字段即可 多表联合查询也可用此方法包装