using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Data.SqlClient; using System.Reflection; using System.Data; using System.Collections; using System.Web; using System.Web.Caching; public class SqlDbHelper { public static string constr = ConfigurationManager.AppSettings["MESProduction"].ToString(); #region 验证数据库是否连接 /// <summary> /// 测试数据库是否可以正常连接,time如果默认就不填写 如果填写则加timeout连接字符串 /// </summary> /// <returns></returns> public static bool ChechSqlServer(int timeout) { string connnectstring = ""; if (timeout != 0) { connnectstring = constr + ";Connect Timeout=" + timeout; } else { connnectstring = constr; } //constr里不要加;Connect Timeout=5000参数如果加参数此处需要修改 bool succeed = false; try { SqlConnection p_connectionString = new SqlConnection(connnectstring); p_connectionString.Open(); SqlCommand p_selectCommand = new SqlCommand("SELECT 1", p_connectionString); SqlDataReader reader = p_selectCommand.ExecuteReader(); if (reader.HasRows) succeed = true; reader.Dispose(); reader.Close(); p_connectionString.Close(); } catch { } return succeed; } #endregion #region 根据实体类名获取表名 /// <summary> /// 根据实体类名返回数据库表名和其字段 /// </summary> /// <typeparam name="T">实体类</typeparam> /// <param name="t">实体对象</param> /// <returns>数据表名和字段</returns> public static Dictionary<string, PropertyInfo[]> GetTableName<T>(T t) { if (t == null) { return null; } PropertyInfo[] propertys = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); if (propertys.Length <= 0) { return null; } Dictionary<string, PropertyInfo[]> dic = new Dictionary<string, PropertyInfo[]>(); string fname = t.ToString(); string cname = typeof(T).Name; dic[cname] = propertys; return dic; } #endregion #region 增加一个记录 /// <summary> /// 添加一条数据到数据库,排除主键在SQL中出现 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="constr">数据连接字符串</param> /// <returns>是否写入成功</returns> public static bool InsertModel<T>(T t, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; InsertSqlParams<T>(t, out sql, out sp); return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } /// <summary> /// 添加一条数据到数据库,排除主键在SQL中出现 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <returns>是否写入成功</returns> public static bool InsertModel<T>(T t) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; InsertSqlParams<T>(t, out sql, out sp); return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } /// <summary> /// 添加一条数据到数据库,主键在SQL中出现 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="constr">数据连接字符串</param> /// <returns>是否写入成功</returns> public static bool InsertModelGuid<T>(T t) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; InsertSqlParamsNoParimary<T>(t, out sql, out sp, constr); return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } /// <summary> /// 添加一条数据到数据库,主键在SQL中出现 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="constr">数据连接字符串</param> /// <returns>是否写入成功</returns> public static bool InsertModelGuid<T>(T t, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; InsertSqlParamsNoParimary<T>(t, out sql, out sp, constr); return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } /// <summary> /// 添加一条数据到数据库,不进行数据表字段对比 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">实体对象</param> /// <param name="constr">连接字符串</param> /// <returns>是否写入成功</returns> public static bool InsertModelnoEq<T>(T t, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; if (InsertSqlParamsnoEp<T>(t, out sql, out sp)) { return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } return false; } /// <summary> /// 添加一条数据到数据库,并返回主标识id /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="id">数据成功插入后返回主标识id</param> /// <param name="constr">数据库连接字符串</param> /// <returns>数据插入是否成功</returns> public static bool InsertModel<T>(T t, out int id, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; InsertSqlParamsWithIdentity<T>(t, out sql, out sp); id = ExecuteNonQueryWithIdentity(conn, CommandType.Text, sql, sp); if (id > 0) { return true; } return false; } /// <summary> /// 插入一条数据并返回主键ID /// </summary> /// <typeparam name="T">数据实体</typeparam> /// <param name="t">实体参数</param> /// <param name="constr">数据库连接字符串</param> /// <returns>主键</returns> public static int InsertModelReturnIdentity<T>(T t, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; InsertSqlParamsWithIdentity<T>(t, out sql, out sp); return ExecuteNonQueryWithIdentity(conn, CommandType.Text, sql, sp); } public static bool InsertSqlParamsWithIdentity<T>(T t, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; try { string cname = typeof(T).Name; //构造参数化SQL命令 StringBuilder ExeSql = new StringBuilder(); StringBuilder Params = new StringBuilder(); ExeSql.Append("insert into " + cname + " ("); //循环补充字段和参数 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); if (dic == null || dic.Count == 0) { return false; } int counts = dic.Count; foreach (PropertyInfo pi in typeof(T).GetProperties()) { CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { if (!item.IsPrimary) { object v = pi.GetValue(t, null); if (v != null)//只对赋值了的属性进行操作 { ExeSql.Append(pi.Name + ","); Params.Append("@" + pi.Name + ","); list.Add(CP.cPa(item, v)); } } } } SqlParameter sp = new SqlParameter("@" + ParameterDirection.ReturnValue.ToString(), SqlDbType.Int); sp.Direction = ParameterDirection.Output; list.Add(sp); sql = ExeSql.ToString().TrimEnd(',') + ") values (" + Params.ToString().TrimEnd(',') + ");select @" + ParameterDirection.ReturnValue.ToString() + "=SCOPE_IDENTITY()"; paras = list.ToArray(); return true; } catch { return false; } } /// <summary> /// 循环T类型属性,表主键不插入方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns></returns> public static bool InsertSqlParams<T>(T t, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; try { StringBuilder ExeSql = new StringBuilder(); StringBuilder Params = new StringBuilder(); string cname = typeof(T).Name; ExeSql.Append("insert into " + cname + " ("); //循环补充字段和参数 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); if (dic == null || dic.Count == 0) { return false; } foreach (PropertyInfo pi in typeof(T).GetProperties()) { CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { if (!item.IsPrimary) { object v = pi.GetValue(t, null); if (v != null)//只对赋值了的属性进行操作 { ExeSql.Append(pi.Name + ","); Params.Append("@" + pi.Name + ","); list.Add(CP.cPa(item, v)); } } } } sql = ExeSql.ToString().TrimEnd(',') + ") values (" + Params.ToString().TrimEnd(',') + ")"; paras = list.ToArray(); return true; } catch { return false; } } /// <summary> /// 循环T类型属性,表主键插入方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns></returns> public static bool InsertSqlParamsNoParimary<T>(T t, out string sql, out SqlParameter[] paras, string constr) { sql = ""; paras = null; try { StringBuilder ExeSql = new StringBuilder(); StringBuilder Params = new StringBuilder(); string cname = typeof(T).Name; ExeSql.Append("insert into " + cname + " ("); //循环补充字段和参数 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); if (dic == null || dic.Count == 0) { return false; } foreach (PropertyInfo pi in typeof(T).GetProperties()) { CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { object v = pi.GetValue(t, null); if (v != null)//只对赋值了的属性进行操作 { ExeSql.Append(pi.Name + ","); Params.Append("@" + pi.Name + ","); list.Add(CP.cPa(item, v)); } } } sql = ExeSql.ToString().TrimEnd(',') + ") values (" + Params.ToString().TrimEnd(',') + ")"; paras = list.ToArray(); return true; } catch { return false; } } /// <summary> /// 构造添加执行语句 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns>是否异常</returns> public static bool InsertSqlParamsnoEp<T>(T t, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; StringBuilder ExeSql = new StringBuilder(); StringBuilder Params = new StringBuilder(); try { string cname = typeof(T).Name; List<SqlParameter> list = new List<SqlParameter>(); ExeSql.Append("insert into " + cname + " ("); foreach (PropertyInfo item in typeof(T).GetProperties()) { object o = item.GetValue(t, null); if (o != null) { if (item.Name.ToLower() != "id") { ExeSql.Append(item.Name + ","); Params.Append("@" + item.Name + ","); list.Add(createParam(item, o)); } } } sql = ExeSql.ToString().TrimEnd(',') + ")values(" + Params.ToString().TrimEnd(',') + ")"; paras = list.ToArray(); return true; } catch { return false; } } /// <summary> /// 添加一条数据到数据库 /// </summary> /// <param name="Fields">表字段</param> /// <param name="Table">表名</param> /// <param name="constr">数据连接字符串</param> /// <returns>是否成功完成操作</returns> public static bool InsertRecord(Dictionary<string, object> Fields, string Table, string constr) { SqlConnection connection = new SqlConnection(constr); StringBuilder builder = new StringBuilder(""); Table = Table.Replace("'", ""); builder.Append("insert into " + Table + " ("); IEnumerator<KeyValuePair<string, object>> enumerator = Fields.GetEnumerator(); StringBuilder builder2 = new StringBuilder(); List<SqlParameter> pitems = new List<SqlParameter>(); while (enumerator.MoveNext()) { KeyValuePair<string, object> current = enumerator.Current; string key = current.Key; object obj = current.Value; //只处理已赋值的项 if (!string.IsNullOrEmpty(key) && (obj != null)) { builder.Append(key + ","); builder2.Append("@" + key + ","); pitems.Add(createParam(key, obj)); } } string sql = builder.ToString().TrimEnd(',') + ") values (" + builder2.ToString().TrimEnd(',') + ")"; if (ExecuteNonQuery(connection, CommandType.Text, sql, pitems.ToArray()) > 0) return true; return false; } /// <summary> /// 添加一条数据到数据库 /// </summary> /// <param name="Fields">表字段</param> /// <param name="Table">表名</param> /// <param name="id">数据插入后返回主标识(自动增长字段值)</param> /// <param name="constr">数据连接字符串</param> /// <returns>是否成功完成操作</returns> public static bool InsertRecord(Dictionary<string, object> Fields, string Table, out int id, string constr) { id = 0; SqlConnection connection = new SqlConnection(constr); StringBuilder builder = new StringBuilder(""); Table = Table.Replace("'", ""); builder.Append("insert into " + Table + " ("); IEnumerator<KeyValuePair<string, object>> enumerator = Fields.GetEnumerator(); StringBuilder builder2 = new StringBuilder(); List<SqlParameter> pitems = new List<SqlParameter>(); while (enumerator.MoveNext()) { KeyValuePair<string, object> current = enumerator.Current; string key = current.Key; object obj = current.Value; //只处理已赋值的项 if (!string.IsNullOrEmpty(key) && (obj != null)) { builder.Append(key + ","); builder2.Append("@" + key + ","); pitems.Add(createParam(key, obj)); } } SqlParameter sp = new SqlParameter("@out_return_id", SqlDbType.Int); sp.Direction = ParameterDirection.Output; pitems.Add(sp); string sql = builder.ToString().TrimEnd(',') + ") values (" + builder2.ToString().TrimEnd(',') + ") select @out_return_id=SCOPE_IDENTITY()"; if (ExecuteNonQueryOutID(connection, CommandType.Text, sql, pitems.ToArray()) > 0) return true; return false; } #endregion #region 更新一个记录 /// <summary> /// 更新一个记录,按主键 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="constr">数据库连接字符串</param> /// <returns></returns> public static bool UpdateModel<T>(T t, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; UpdateSqlParams<T>(t, out sql, out sp); return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } /// <summary> /// 更新某条记录,按主键 更新多个字段 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="p">字典参数</param> /// <param name="constr">数据库连接字符串</param> /// <returns></returns> public static bool UpdateModel<T>(Dictionary<string, object> p, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; UpdateSqlParams<T>(p, out sql, out sp); return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } /// <summary> /// 更新某条记录,按主键 更新多个字段 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">实体对象</param> /// <param name="constr">数据库连接字符串</param> /// <returns></returns> public static bool UpdateModelnoEp<T>(T t, string constr) { SqlConnection conn = new SqlConnection(constr); string sql = string.Empty; SqlParameter[] sp = null; if (UpdateSqlParamsnoEp<T>(t, out sql, out sp)) { return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0); } return false; } public static bool UpdateSqlParams<T>(T t, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; PropertyInfo[] propertys = typeof(T).GetProperties(); string cname = typeof(T).Name; //构造参数化SQL命令 StringBuilder ExeSql = new StringBuilder(); ExeSql.Append("update " + cname + " set "); //循环补充字段和参数 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); if (dic == null || dic.Count == 0) { return false; } string primaryKey = string.Empty; foreach (PropertyInfo pi in propertys) { var propertyType = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType;//得到属性定义类型 string t_p = propertyType.ToString().ToLower();//转化为小写 t_p = t_p.Substring(t_p.IndexOf('.') + 1, t_p.Length - t_p.IndexOf('.') - 1); object v = pi.GetValue(t, null); if ((t_p == "string" || t_p == "char") && v == null) v = ""; //object v = pi.GetValue(t, null); if (v != null)//只对赋值了的属性进行操作 { CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { if (!item.IsPrimary) { ExeSql.Append(pi.Name + "=@" + pi.Name + ","); } else { primaryKey = pi.Name; } list.Add(CP.cPa(item, v)); } } } sql = ExeSql.ToString().TrimEnd(',') + " where " + primaryKey + "=@" + primaryKey; paras = list.ToArray(); return true; } public static bool UpdateSqlParams<T>(Dictionary<string, object> p, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; try { PropertyInfo[] propertys = typeof(T).GetProperties(); string cname = typeof(T).Name; StringBuilder ExeSql = new StringBuilder(); //构造参数化SQL命令 ExeSql.Append("update " + cname + " set "); //循环补充字段和参数 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); if (dic == null || dic.Count == 0) { return false; } //集合枚举 IEnumerator<KeyValuePair<string, object>> enumerator = p.GetEnumerator(); string primaryKey = string.Empty;//主键参数 foreach (PropertyInfo pi in propertys) { while (enumerator.MoveNext()) { KeyValuePair<string, object> current = enumerator.Current; string key = current.Key; object obj = current.Value; if (!string.IsNullOrEmpty(key) && (obj != null)) { CP.ColumnInfo item = dic.Find(c => c.ColName.ToLower() == key.ToLower()); if (item != null) { if (item.IsPrimary) { primaryKey = pi.Name; } else { ExeSql.Append(key + "=@" + key + ","); } list.Add(CP.cPa(item, obj)); } } } } sql = ExeSql.ToString().TrimEnd(',') + " where " + primaryKey + "=@" + primaryKey; paras = list.ToArray(); return true; } catch { return false; } } public static bool UpdateSqlParamsnoEp<T>(T t, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; try { string cname = typeof(T).Name; //构造参数化SQL命令 StringBuilder ExeSql = new StringBuilder(); ExeSql.Append("update " + cname + " set "); //循环补充字段和参数 List<SqlParameter> list = new List<SqlParameter>(); string primaryKey = string.Empty; //主键 foreach (PropertyInfo item in typeof(T).GetProperties()) { object v = item.GetValue(t, null); if (v != null) { if (item.Name.ToLower() != "id") { ExeSql.Append(item.Name + "=@" + item.Name + ","); } else { primaryKey = item.Name + "=@" + item.Name; } list.Add(createParam(item, v)); } } sql = ExeSql.ToString().TrimEnd(',') + " where " + primaryKey; paras = list.ToArray(); return true; } catch { return false; } } #endregion #region 得到一个记录 /// <summary> /// 根据主键标识id获取一个记录 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="id">主键标识id</param> /// <param name="constr">数据库连接字符串</param> /// <returns>一个数据实体所有信息</returns> public static T GetModel<T>(int id, string constr) where T : new() { // 获得此模型的类型 T t = new T(); string sql = string.Empty; SqlParameter[] sp = null; PropertyInfo[] propertys = null; GetSqlParams<T>(id, out sql, out sp, out propertys); DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp); if (ds.Tables.Count == 0) { return default(T); } DataTable dt = ds.Tables[0]; if (dt.Rows.Count <= 0) { return default(T); } string tempName = ""; foreach (DataRow dr in dt.Rows) { // 获得此模型的公共属性 foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value && value != null) pi.SetValue(t, value, null); } } } return t; } public static bool GetSqlParams<T>(int id, out string sql, out SqlParameter[] paras, out PropertyInfo[] py) { sql = ""; paras = null; //获取数据实体信息 string cname = typeof(T).Name; py = typeof(T).GetProperties(); List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); string searchCols = string.Empty; string primaryKey = string.Empty; foreach (PropertyInfo pi in py) { CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { if (item.IsPrimary) { primaryKey = item.ColName; list.Add(CP.cPa(item, id)); } searchCols += pi.Name + ","; } } searchCols = searchCols.TrimEnd(','); sql = "select " + searchCols + " from " + cname + " where " + primaryKey + "=@" + primaryKey; paras = list.ToArray(); return true; } public static bool GetSqlParams<T>(int id, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; // 获得此模型的类型 string cname = typeof(T).Name; //获取数据实体信息 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); if (dic == null || dic.Count == 0) { return false; } string searchCols = string.Empty; string primaryKey = string.Empty; foreach (PropertyInfo pi in typeof(T).GetProperties()) { CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { if (item.IsPrimary) { primaryKey = item.ColName; list.Add(CP.cPa(item, id)); } searchCols += pi.Name + ","; } } searchCols = searchCols.TrimEnd(','); sql = "select " + searchCols + " from " + cname + " where " + primaryKey + "=@" + primaryKey; paras = list.ToArray(); return true; } /// <summary> /// 根据一个或多个实体赋值字段做为查询条件得到一个新的实体 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="constr">数据库连接字符串</param> /// <returns>一个数据实体所有信息</returns> public static T GetModel<T>(IDictionary<string, object> p, string constr) where T : new() { string sql = ""; SqlParameter[] sp = null; PropertyInfo[] propertys = null; T t = new T(); GetSqlParams<T>(p, out sql, out sp, out propertys); DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp); if (ds.Tables.Count == 0) { return default(T); } DataTable dt = ds.Tables[0]; if (dt.Rows.Count <= 0) { return default(T); } string tempName = ""; foreach (DataRow dr in dt.Rows) { // 获得此模型的公共属性 foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value && value != null) pi.SetValue(t, value, null); } } } return t; } public static bool GetSqlParams<T>(IDictionary<string, object> p, out string sql, out SqlParameter[] paras) { sql = ""; paras = null; string cname = typeof(T).Name; //获取数据实体信息 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = null; //判断T是否为视图 dic = cname.StartsWith("V") ? CP.TCV(cname, constr) : CP.TC(cname, constr); string searchCols = string.Empty; string primaryKey = string.Empty; string temp = ""; bool Isfirst = true; foreach (PropertyInfo pi in typeof(T).GetProperties()) { CP.ColumnInfo item = dic.Find(c => c.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { searchCols += pi.Name + ","; } } //检查查询字典,如果为空,直接返回 if (p != null && p.Count != 0) { IEnumerator<KeyValuePair<string, object>> enumera = p.GetEnumerator(); while (enumera.MoveNext()) { KeyValuePair<string, object> current = enumera.Current; string key = current.Key; object v = current.Value; if (!string.IsNullOrEmpty(key) && (v != null)) { CP.ColumnInfo item = dic.Find(m => m.ColName.ToLower() == key.ToLower()); if (item != null) { list.Add(CP.cPa(item, v)); if (Isfirst) { temp += item.ColName + "=@" + item.ColName; Isfirst = false; } else { temp += " and " + item.ColName + "=@" + item.ColName; } } } } } else { temp = "1=1"; } searchCols = searchCols.TrimEnd(','); sql = "select " + searchCols + " from " + cname + " where " + temp; paras = list.ToArray(); return true; } public static bool GetSqlParams<T>(IDictionary<string, object> p, out string sql, out SqlParameter[] paras, out PropertyInfo[] py) { sql = ""; paras = null; py = typeof(T).GetProperties(); string cname = typeof(T).Name; //获取数据实体信息 List<SqlParameter> list = new List<SqlParameter>(); List<CP.ColumnInfo> dic = CP.TC(cname, constr); string searchCols = string.Empty; string primaryKey = string.Empty; string temp = ""; bool Isfirst = true; foreach (PropertyInfo pi in py) { CP.ColumnInfo item = dic.Find(c => c.ColName.ToLower() == pi.Name.ToLower()); if (item != null) { searchCols += pi.Name + ","; } } //检查查询字典,如果为空,直接返回 if (p == null || p.Count == 0) { return false; } IEnumerator<KeyValuePair<string, object>> enumera = p.GetEnumerator(); while (enumera.MoveNext()) { KeyValuePair<string, object> current = enumera.Current; string key = current.Key; object v = current.Value; if (!string.IsNullOrEmpty(key) && (v != null)) { CP.ColumnInfo item = dic.Find(m => m.ColName.ToLower() == key.ToLower()); if (item != null) { list.Add(CP.cPa(item, v)); if (Isfirst) { temp += item.ColName + "=@" + item.ColName; Isfirst = false; } else { temp += " and " + item.ColName + "=@" + item.ColName; } } } } searchCols = searchCols.TrimEnd(','); sql = "select " + searchCols + " from " + cname + " where " + temp; paras = list.ToArray(); return true; } #endregion #region 删除一个记录 /// <summary> /// 删除一个记录 /// </summary> /// <param name="id">标示ID</param> /// <param name="tableName">数据表名</param> /// <returns>成功失败</returns> public static bool DelSingle(string sql, string constr) { using (SqlConnection conn = new SqlConnection(constr)) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, conn, null, CommandType.Text, sql, null); int count = 0; try { count = cmd.ExecuteNonQuery(); } catch (Exception e) { throw e; } finally { CloseConnection(conn); } if (count > 0) return true; return false; } } /// <summary> /// 从数据库表中删除一个记录,按主键标识id /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="t">数据实体对象</param> /// <param name="constr">数据连接字符串</param> /// <returns>是否删除成功</returns> public static bool DeleteModel<T>(T t, string constr) { if (t == null) { return false; } // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); if (propertys.Length <= 0) { return false; } string fname = t.ToString(); string cname = fname.Substring(fname.LastIndexOf(".") + 1, fname.Length - fname.LastIndexOf(".") - 1); bool result = false; foreach (PropertyInfo pi in propertys) { object v = pi.GetValue(t, null); if (v != null)//只对赋值了的属性进行操作, { if (pi.Name.ToString().ToLower() == "id") { SqlParameter[] pitems = { new SqlParameter("@" + pi.Name, SqlDbType.Int) }; pitems[0].Value = int.Parse(v.ToString()); string sql = "delete from " + cname + " where id=@" + pi.Name + ""; SqlConnection conn = new SqlConnection(constr); if (ExecuteNonQuery(conn, CommandType.Text, sql, pitems) > 0) { result = true; } break; } } } return result; } /// <summary> /// 根据主键ID删除一条记录,注:主键必须是ID,且存在 /// </summary> /// <typeparam name="T">删除实体</typeparam> /// <param name="id">ID</param> /// <param name="constr">数据库连接</param> /// <returns>成功失败</returns> public static bool DeleteModel<T>(int id, string constr) where T : new() { if (id == 0) return false; string cname = typeof(T).Name; string sql = "delete from " + cname + " where id=@id"; SqlParameter para = new SqlParameter("@id", id); SqlConnection conn = new SqlConnection(constr); if (ExecuteNonQuery(conn, CommandType.Text, sql, para) > 0) return true; return false; } /// <summary> /// 删除多条记录,按条件 /// </summary> /// <typeparam name="T">要删除的实体类</typeparam> /// <param name="p">键值对</param> /// <param name="constr">数据库连接</param> /// <returns>成功失败</returns> public static bool DeleteModel<T>(IDictionary<string, object> p, string constr) { if (p == null || p.Count == 0) return false; string tablename = typeof(T).Name; StringBuilder ExeSql = new StringBuilder(); ExeSql.Append("delete from " + tablename); IEnumerator<KeyValuePair<string, object>> enumerator = p.GetEnumerator(); List<SqlParameter> list = new List<SqlParameter>(); bool isFirst = true; while (enumerator.MoveNext()) { KeyValuePair<string, object> current = enumerator.Current; string key = current.Key; object obj = current.Value; if (!string.IsNullOrEmpty(key) && (obj != null)) { if (isFirst) { ExeSql.Append(" where " + key + "=@" + key); isFirst = false; } else { ExeSql.Append(" and " + key + "=@" + key); } list.Add(createParam(key, obj)); } } SqlConnection conn = new SqlConnection(constr); try { if (ExecuteNonQuery(conn, CommandType.Text, ExeSql.ToString(), list.ToArray()) > 0) return true; return false; } catch { return false; } } #endregion #region 得到多个记录 /// <summary> /// 根据ID得到多个记录 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql">SQL查询命令</param> /// <param name="constr">数据库连接</param> /// <param name="paras">可变参数</param> /// <returns></returns> public static List<T> GetMoreModel<T>(string sql, string constr, params SqlParameter[] paras) where T : new() { List<T> list = new List<T>(); DataSet ds = Query(sql, paras); int count = ds.Tables[0].Rows.Count; if (count == 0) { return null; } string tempName = ""; foreach (DataRow dr in ds.Tables[0].Rows) { T v = new T(); // 获得此模型的公共属性 foreach (PropertyInfo pi in typeof(T).GetProperties()) { tempName = pi.Name; // 检查DataTable是否包含此列 if (ds.Tables[0].Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value && value != null) pi.SetValue(v, value, null); } } list.Add(v); } return list; } /// <summary> /// 根据键值对获取多个记录 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="p">条件</param> /// <param name="constr">数据库连接</param> /// <param name="param">参数</param> /// <returns></returns> public static List<T> GetMoreModel<T>(Dictionary<string, object> p, string constr, params SqlParameter[] param) where T : new() { List<T> list = new List<T>(); string sql = string.Empty; SqlParameter[] sp = null; GetSqlParams<T>(p, out sql, out sp); DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp); int count = ds.Tables[0].Rows.Count; if (count == 0) { return null; } string tempName = ""; foreach (DataRow dr in ds.Tables[0].Rows) { T v = new T(); // 获得此模型的公共属性 foreach (PropertyInfo pi in typeof(T).GetProperties()) { tempName = pi.Name; // 检查DataTable是否包含此列 if (ds.Tables[0].Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value && value != null) pi.SetValue(v, value, null); } } list.Add(v); } return list; } /// <summary> /// 根据键值对获取多个记录 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="p">条件</param> /// <param name="sort">条件排序 id desc</param> /// <param name="constr">数据库连接</param> /// <param name="param">参数</param> /// <returns></returns> //public static List<T> GetMoreModel<T>(Dictionary<string, object> p,string sort, string constr, params SqlParameter[] param) where T : new() //{ // List<T> list = new List<T>(); // string sql = string.Empty; SqlParameter[] sp = null; // GetSqlParams<T>(p, out sql, out sp); // if (!string.IsNullOrEmpty(sort)) { sql += " order by "+sort; } // DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp); // int count = ds.Tables[0].Rows.Count; // if (count == 0) // { // return null; // } // string tempName = ""; // foreach (DataRow dr in ds.Tables[0].Rows) // { // T v = new T(); // // 获得此模型的公共属性 // foreach (PropertyInfo pi in typeof(T).GetProperties()) // { // tempName = pi.Name; // // 检查DataTable是否包含此列 // if (ds.Tables[0].Columns.Contains(tempName)) // { // // 判断此属性是否有Setter // if (!pi.CanWrite) continue; // object value = dr[tempName]; // if (value != DBNull.Value && value != null) // pi.SetValue(v, value, null); // } // } // list.Add(v); // } // return list; //} #endregion #region 根据SQL获取单值object /// <summary> /// 执行一条SQL语句,返回查询结果(object)。 /// </summary> /// <param name="SQLString">SQL命令</param> /// <param name="constr">数据库连接串</param> /// <returns>查询结果(object)</returns> public static object GetSingle(string SQLString, string constr) { using (SqlConnection connection = new SqlConnection(constr)) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, null); try { object obj = cmd.ExecuteScalar(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (Exception e) { throw e; } finally { CloseConnection(connection); } } } /// <summary> /// 执行一条计算查询结果语句,返回查询结果(object)。 /// </summary> /// <param name="SQLString">计算查询结果语句</param> /// <returns>查询结果(object)</returns> public static object GetSingle(string SQLString, params SqlParameter[] cmdParms) { using (SqlConnection connection = new SqlConnection(constr)) { using (SqlCommand cmd = new SqlCommand()) { try { PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, cmdParms); object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (System.Data.SqlClient.SqlException e) { throw e; } finally { CloseConnection(connection); } } } } /// <summary> /// 执行一条计算查询结果语句,返回查询结果(object)。 /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="trans">SqlTransaction事务</param> /// <param name="SQLString">计算查询结果语句</param> /// <returns>查询结果(object)</returns> public static object GetSingle(SqlConnection connection, SqlTransaction trans, string SQLString, params SqlParameter[] cmdParms) { using (SqlCommand cmd = new SqlCommand()) { try { PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, cmdParms); object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (System.Data.SqlClient.SqlException e) { trans.Rollback(); throw e; } finally { CloseConnection(connection); } } } /// <summary> /// 是否存在该记录 /// </summary> /// <param name="strSql">语句</param> /// <param name="cmdParms">参数</param> /// <returns>结果</returns> public static bool Exists(string strSql, params SqlParameter[] cmdParms) { object obj = GetSingle(strSql, cmdParms); int cmdresult; if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } if (cmdresult == 0) { return false; } else { return true; } } #endregion #region 根据SQL语句执行SQL指令 返回int /// <summary> /// 执行单纯的SQL语句 /// </summary> /// <param name="SQLString">SQL语句</param> /// <param name="constr">数据库连接</param> /// <returns>结果(int)</returns> public static int ExecuteCmd(string SQLString, string constr) { int result = 0; using (SqlConnection conn = new SqlConnection(constr)) { try { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, conn, null, CommandType.Text, SQLString, null); result = cmd.ExecuteNonQuery(); } catch (Exception e) { throw e; } finally { CloseConnection(conn); } return result; } } /// <summary> /// 执行SQL指令带参数 /// </summary> /// <param name="SQLString">SQL语句</param> /// <param name="constr">数据库连接字符串</param> /// <param name="para">参数</param> /// <returns>结果(int)</returns> public static int ExecuteCmd(string SQLString, string constr, params SqlParameter[] para) { int result = 0; using (SqlConnection conn = new SqlConnection(constr)) { SqlCommand cmd = new SqlCommand(); try { PrepareCommand(cmd, conn, null, CommandType.Text, SQLString, para); result = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } catch (Exception e) { throw e; } finally { CloseConnection(conn); } return result; } } #endregion #region 执行Sql命令 /// <summary> /// 执行Cmd /// </summary> /// <param name="connection">连接对象</param> /// <param name="commandType">类型</param> /// <param name="commandText">内容</param> /// <param name="commandParameters">参数</param> /// <returns>结果</returns> public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters); int retval = 0; try { retval = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } catch (Exception ee) { throw ee; } finally { CloseConnection(connection); } return retval; } /// <summary> /// 执行cmd命令返回主键 ID /// </summary> /// <param name="connection"></param> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="commandParameters"></param> /// <returns></returns> public static int ExecuteNonQueryWithIdentity(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters); int retval = 0; try { cmd.ExecuteNonQuery(); retval = int.Parse(cmd.Parameters["@" + ParameterDirection.ReturnValue.ToString()].Value.ToString()); cmd.Parameters.Clear(); } catch (Exception e) { throw e; } finally { CloseConnection(connection); } return retval; } /// <summary> /// Execute a SqlCommand (that returns no resultset) against the specified SqlConnection /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); /// </remarks> /// <param name="connection">A valid SqlConnection</param> /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> /// <param name="commandText">The stored procedure name or T-SQL command</param> /// <param name="commandParameters">An array of SqlParamters used to execute the command</param> /// <returns>An int representing the number of rows affected by the command</returns> public static int ExecuteNonQueryOutID(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters); int retval = 0; try { cmd.ExecuteNonQuery(); retval = int.Parse(cmd.Parameters["@out_return_id"].Value.ToString()); cmd.Parameters.Clear(); } catch (Exception e) { throw e; } finally { CloseConnection(connection); } return retval; } /// <summary> /// 返回带返回参数的过程 /// </summary> /// <param name="connection">数据库连接对象</param> /// <param name="commandType">数据类型</param> /// <param name="commandText">存储过程名或SQL语句</param> /// <param name="commandParameters">参数</param> /// <returns>参数</returns> public static SqlParameter[] ExecuteNonQueryOutPara(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlParameter[] para = null; PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters); try { cmd.ExecuteNonQuery(); if (commandParameters != null) { para = commandParameters; for (int i = 0; i < commandParameters.Length; i++) { if (commandParameters[i].Direction == ParameterDirection.Output || commandParameters[i].Direction == ParameterDirection.ReturnValue) { para[i].ParameterName = commandParameters[i].ParameterName; para[i].Value = commandParameters[i].Value; } } } cmd.Parameters.Clear(); } catch (Exception e) { throw e; } finally { CloseConnection(connection); } return para; } /// <summary> /// 事务处理,执行SQL语句,返回影响的记录数,只执行一个命令,不关闭连接,连接关闭在调用端执行 /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="trans">SqlTransaction事件</param> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(SqlConnection connection, SqlTransaction trans, string SQLString) { int rows = 0; using (SqlCommand cmd = new SqlCommand()) { PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, null); try { rows = cmd.ExecuteNonQuery(); } catch { trans.Rollback(); } finally { CloseConnection(connection); } return rows; } } /// <summary> /// 事务处理,执行SQL语句,返回影响的记录数,连接关闭在调用端执行 /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="trans">SqlTransaction事务</param> /// <param name="commandType">Sql命令类型</param> /// <param name="SQLString">Sql查询语句</param> /// <param name="cmdParms">Sql命令参数数组</param> /// <returns>影响的记录数</returns> public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (transaction == null) throw new ArgumentNullException("transaction"); if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); // Create a command and prepare it for execution SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); // Finally, execute the command int retval = 0; try { retval = cmd.ExecuteNonQuery(); // Detach the SqlParameters from the command object, so they can be used again cmd.Parameters.Clear(); } catch (Exception e) { transaction.Rollback(); throw e; } finally { CloseConnection(transaction.Connection); } return retval; } /// <summary> /// 执行多条SQL语句,实现数据库事务。 /// </summary> /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param> public static void ExecuteSqlTranWithIndentity(List<CommandInfo> SQLStringList, out int identity) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); using (SqlTransaction trans = conn.BeginTransaction()) { SqlCommand cmd = new SqlCommand(); try { identity = 0; //循环 foreach (CommandInfo myDE in SQLStringList) { string cmdText = myDE.CommandText; SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters; foreach (SqlParameter q in cmdParms) { if (q.Direction == ParameterDirection.InputOutput) { q.Value = identity; } } PrepareCommand(cmd, conn, trans, CommandType.Text, cmdText, cmdParms); int val = cmd.ExecuteNonQuery(); foreach (SqlParameter q in cmdParms) { if (q.Direction == ParameterDirection.Output) { identity = Convert.ToInt32(q.Value); } } cmd.Parameters.Clear(); } trans.Commit(); } catch { trans.Rollback(); throw; } finally { CloseConnection(conn); } } } } /// <summary> /// 执行多条SQL语句,实现数据库事务。 /// </summary> /// <param name="SQLStringList">SQL命令集合</param> public static int ExecuteSqlTran(List<CommandInfo> cmdList) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); using (SqlTransaction trans = conn.BeginTransaction()) { SqlCommand cmd = new SqlCommand(); try { int count = 0; //循环 foreach (CommandInfo myDE in cmdList) { string cmdText = myDE.CommandText; SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters; PrepareCommand(cmd, conn, trans, CommandType.Text, cmdText, cmdParms); int val = cmd.ExecuteNonQuery(); count += val; cmd.Parameters.Clear(); } trans.Commit(); return count; } catch { trans.Rollback(); throw; } finally { CloseConnection(conn); } } } } /// <summary> /// 执行多条SQL语句,实现数据库事务。 /// </summary> /// <param name="SQLStringList">多条SQL语句</param> public static int ExecuteSqlTran(List<String> SQLStringList) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; SqlTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { int count = 0; for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n]; if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; count += cmd.ExecuteNonQuery(); } } tx.Commit(); return count; } catch { tx.Rollback(); return 0; } finally { CloseConnection(conn); } } } /// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms) { using (SqlConnection connection = new SqlConnection(constr)) { int rows = 0; using (SqlCommand cmd = new SqlCommand()) { try { PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, cmdParms); rows = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } catch (System.Data.SqlClient.SqlException e) { throw e; } finally { CloseConnection(connection); } } return rows; } } /// <summary> /// 执行SQL语句,返回影响行数 /// </summary> /// <param name="commandType">操作类型</param> /// <param name="commandText">SQL语句</param> /// <param name="constr">数据库连接字符串</param> /// <param name="para">参数</param> /// <returns>影响的行数</returns> public static int ExecuteQuery(CommandType commandType, string commandText, string constr, params SqlParameter[] para) { using (SqlConnection conn = new SqlConnection(constr)) { return ExecuteNonQuery(conn, commandType, commandText, para); } } /// <summary> /// 执行SQL语句,返回影响行数并返回主键ID /// </summary> /// <param name="commandType">操作类型</param> /// <param name="commandText">SQL语句</param> /// <param name="constr">数据库连接</param> /// <param name="id">抛出的主键ID</param> /// <param name="para">参数</param> /// <returns>影响的行数</returns> public static int ExecuteQuery(CommandType commandType, string commandText, string constr, out int id, params SqlParameter[] para) { id = 0; int result = -1; using (SqlConnection conn = new SqlConnection(constr)) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, conn, (SqlTransaction)null, commandType, commandText, para); try { result = cmd.ExecuteNonQuery(); id = int.Parse(cmd.Parameters["@" + ParameterDirection.ReturnValue.ToString()].Value.ToString()); cmd.Parameters.Clear(); } catch (Exception e) { throw e; } finally { CloseConnection(conn); } } return result; } /// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="trans">SqlTransaction对象</param> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(SqlConnection connection, SqlTransaction trans, string SQLString, params SqlParameter[] cmdParms) { using (SqlCommand cmd = new SqlCommand()) { int rows = 0; try { PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, cmdParms); rows = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } catch (System.Data.SqlClient.SqlException e) { trans.Rollback(); throw e; } finally { CloseConnection(connection); } return rows; } } #endregion #region 获取数据集,含分页 /// <summary> /// 对应object数组到SqlParameter数组 /// </summary> /// <param name="commandParameters">SqlParameter参数数组</param> /// <param name="parameterValues">object参数数组</param> private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues) { if ((commandParameters != null) && (parameterValues != null)) { if (commandParameters.Length != parameterValues.Length) { throw new ArgumentException("Parameter count does not match Parameter Value count."); } int index = 0; int length = commandParameters.Length; while (index < length) { if (parameterValues[index] is IDbDataParameter) { IDbDataParameter parameter = (IDbDataParameter)parameterValues[index]; if (parameter.Value == null) { commandParameters[index].Value = DBNull.Value; } else { commandParameters[index].Value = parameter.Value; } } else if (parameterValues[index] == null) { commandParameters[index].Value = DBNull.Value; } else { commandParameters[index].Value = parameterValues[index]; } index++; } } } /// <summary> /// 获取数据集 存储过程使用 /// </summary> /// <param name="connectionString">数据库连接字符串</param> /// <param name="commandType">SqlCommand命令类型</param> /// <param name="commandText">命令内容</param> /// <param name="commandParameters">命令用到参数集合</param> /// <returns>数据集</returns> public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params object[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); SqlParameter[] spParameterSet = SqlHelperParameterCache.GetSpParameterSet(connectionString, commandText); AssignParameterValues(spParameterSet, commandParameters); PrepareCommand(cmd, conn, null, commandType, commandText, spParameterSet); using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { DataSet dataSet = new DataSet(); try { adapter.Fill(dataSet); cmd.Parameters.Clear(); } catch (Exception e) { throw e; } finally { CloseConnection(conn); } return dataSet; } } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, conn, (SqlTransaction)null, commandType, commandText, commandParameters); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataSet ds = new DataSet(); try { da.Fill(ds); cmd.Parameters.Clear(); } catch { throw; } finally { CloseConnection(conn); } return ds; } } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet Query(string SQLString) { using (SqlConnection connection = new SqlConnection(constr)) { DataSet ds = new DataSet(); SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, null); try { SqlDataAdapter command = new SqlDataAdapter(cmd); command.Fill(ds, "ds"); command.Dispose(); } catch (System.Data.SqlClient.SqlException ex) { throw new Exception(ex.Message); } finally { CloseConnection(connection); } return ds; } } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet Query(string SQLString, params SqlParameter[] cmdParms) { using (SqlConnection connection = new SqlConnection(constr)) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, cmdParms); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataSet ds = new DataSet(); try { da.Fill(ds, "ds"); cmd.Parameters.Clear(); } catch (System.Data.SqlClient.SqlException ex) { throw new Exception(ex.Message); } finally { CloseConnection(connection); } return ds; } } } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="trans">SqlTransaction事务</param> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet Query(SqlConnection connection, SqlTransaction trans, string SQLString, params SqlParameter[] cmdParms) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, cmdParms); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataSet ds = new DataSet(); try { da.Fill(ds, "ds"); cmd.Parameters.Clear(); } catch (System.Data.SqlClient.SqlException ex) { trans.Rollback(); throw new Exception(ex.Message); } finally { CloseConnection(connection); } return ds; } } /// <summary> /// Pagination 获取分页数据 /// </summary> /// <param name="item">分页实体类,包含分页存储过程所用到的各个参数</param> /// <param name="connectionString">数据库连接字符串</param> /// <param name="ProName">存储过程名称</param> /// <returns>某一页所有记录</returns> public static DataSet GetPageContent(Pagination item, string connectionString, string ProName) { object[] commandParameters = new object[] { item.Tables, item.PrimaryKey, item.Sort, item.CurrentPage, item.PageSize, item.Fields, item.Filter, item.Group }; return ExecuteDataset(connectionString, CommandType.StoredProcedure, ProName, commandParameters); } /// <summary> /// PaginationByRowNumber获取分页数据 /// </summary> /// <param name="item">分页实体</param> /// <param name="constr">数据库链接</param> /// <param name="ProName">过程名称</param> /// <returns>数据集</returns> public static DataSet GetPageContent(PaginationByRowNumber item, string constr, string ProName) { object[] commandParameter = new object[] { item.Table, item.Sort, item.CurrentPage, item.PageSize, item.Fields, item.Filter }; return ExecuteDataset(constr, CommandType.StoredProcedure, ProName, commandParameter); } /// <summary> /// 获取分页数据 /// </summary> /// <param name="pt">分页实体类,包含分页存储过程所用到的各个参数</param> /// <param name="ProName">存储过程名称</param> /// <param name="constr">数据库连接字符串</param> /// <returns>某一页所有记录</returns> public static DataSet GetItems(Pagination pt, string ProName, string constr) { return GetPageContent(pt, constr, ProName); } /// <summary> /// 获取数据集 /// </summary> /// <param name="commandType">Sql命令类型</param> /// <param name="commandText">Sql命令内容</param> /// <param name="constr">数据库连接字符串</param> /// <returns>数据集</returns> public static DataSet SqlTextDataset(CommandType commandType, string commandText, string constr) { return ExecuteDataset(constr, commandType, commandText, null); } /// <summary> /// 获取数据集 /// </summary> /// <param name="commandType">数据类型</param> /// <param name="commandText">SQL语句或过程</param> /// <param name="constr">数据库连接</param> /// <param name="cmdParms">参数</param> /// <returns>DataSet</returns> public static DataSet SqlTextDataset(CommandType commandType, string commandText, string constr, params SqlParameter[] cmdParms) { return ExecuteDataset(constr, commandType, commandText, cmdParms); } /// <summary> /// 事务处理,执行一条计算查询结果语句,返回查询结果(object)。 /// </summary> /// <param name="connection">SqlConnection对象</param> /// <param name="trans">SqlTransaction事务</param> /// <param name="SQLString">计算查询结果语句</param> /// <returns>查询结果(object)</returns> public static object GetSingle(SqlConnection connection, SqlTransaction trans, CommandType commandType, string SQLString, params SqlParameter[] cmdParms) { using (SqlCommand cmd = new SqlCommand()) { try { PrepareCommand(cmd, connection, trans, commandType, SQLString, cmdParms); object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (Exception e) { trans.Rollback(); throw e; } finally { connection.Close(); } } } #endregion #region 操作帮助方法 /// <summary> /// SqlCommand参数初始化 /// </summary> /// <param name="cmd">Sql命令</param> /// <param name="conn">数据库连接对象</param> /// <param name="trans">事务对象</param> /// <param name="cmdType">Sql命令类型</param> /// <param name="cmdText">Sql命令内容</param> /// <param name="cmdParms">Sql命令参数集合</param> private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) { if (conn.State != ConnectionState.Open) { conn.Open(); } cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) { cmd.Transaction = trans; } cmd.CommandType = cmdType; if (cmdParms != null) { foreach (SqlParameter parameter in cmdParms) { if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } cmd.Parameters.Add(parameter); } } } /// <summary> /// 关闭数据库连接 释放资源 /// </summary> /// <param name="connection">连接对象</param> public static void CloseConnection(SqlConnection connection) { if (connection.State != ConnectionState.Closed) { connection.Dispose(); connection.Close(); } } #endregion #region 建立一个参数 包括Dictionary和T /// <summary> /// OOP根据实体类和所属某个属性返回一个SQL参数 /// </summary> /// <typeparam name="T">数据实体类</typeparam> /// <param name="p">属性</param> /// <param name="t">数据实体对象</param> /// <returns>一个SQL参数,已经初始化</returns> private static SqlParameter createParam(PropertyInfo p, object v) { SqlParameter sp = null; var propertyType = Nullable.GetUnderlyingType(p.PropertyType) ?? p.PropertyType;//得到属性定义类型 string t_p = propertyType.ToString().ToLower();//转化为小写 t_p = t_p.Substring(t_p.IndexOf('.') + 1, t_p.Length - t_p.IndexOf('.') - 1); // int->Int32 decimal->Decimal float->Single double->Double bool->Boolean datetime->DateTime string->String char->Char switch (t_p) { case "byte": sp = new SqlParameter("@" + p.Name, SqlDbType.TinyInt); sp.Value = int.Parse(v.ToString()); break; case "int16": sp = new SqlParameter("@" + p.Name, SqlDbType.SmallInt); sp.Value = int.Parse(v.ToString()); break; case "int32": sp = new SqlParameter("@" + p.Name, SqlDbType.Int); sp.Value = int.Parse(v.ToString()); break; case "decimal": sp = new SqlParameter("@" + p.Name, SqlDbType.Decimal); sp.Value = decimal.Parse(v.ToString()); break; case "single": sp = new SqlParameter("@" + p.Name, SqlDbType.Float); sp.Value = float.Parse(v.ToString()); break; case "double": sp = new SqlParameter("@" + p.Name, SqlDbType.Decimal); sp.Value = decimal.Parse(v.ToString()); break; case "boolean": sp = new SqlParameter("@" + p.Name, SqlDbType.Bit); if (v.ToString().ToLower() == "true") { sp.Value = 1; } else if (v.ToString().ToLower() == "false") { sp.Value = 0; } break; case "datetime": sp = new SqlParameter("@" + p.Name, SqlDbType.DateTime); sp.Value = (DateTime)v; break; case "string": //程序测试时注意数据库表中字段是双字节和单字节可变类型情况 if (System.Text.RegularExpressions.Regex.IsMatch(v.ToString(), @"[^\x00-\xff]+")) { string name = p.Name.ToLower(); if (name.IndexOf("remark") >= 0 || name.IndexOf("content") >= 0 || name.IndexOf("description") >= 0) { sp = new SqlParameter("@" + p.Name, SqlDbType.NVarChar, 2000); } else { sp = new SqlParameter("@" + p.Name, SqlDbType.VarChar, 50); } } else { sp = new SqlParameter("@" + p.Name, SqlDbType.VarChar, 50); } sp.Value = v.ToString(); break; case "char": sp = new SqlParameter("@" + p.Name, SqlDbType.Char, 1); sp.Value = v.ToString(); break; } return sp; } /// <summary> /// 利用Key-Value创建一个参数 /// </summary> /// <param name="current">键值对</param> /// <returns>SQL参数,已经初始化</returns> public static SqlParameter createParam(string key, object obj) { SqlParameter sp = null; string t_p = obj.GetType().ToString().ToLower();//转化为小写 t_p = t_p.Substring(t_p.IndexOf('.') + 1, t_p.Length - t_p.IndexOf('.') - 1); // int->Int32 decimal->Decimal float->Single double->Double bool->Boolean datetime->DateTime string->String char->Char switch (t_p) { case "byte": sp = new SqlParameter("@" + key, SqlDbType.TinyInt); sp.Value = int.Parse(obj.ToString()); break; case "int16": sp = new SqlParameter("@" + key, SqlDbType.SmallInt); sp.Value = int.Parse(obj.ToString()); break; case "int32": sp = new SqlParameter("@" + key, SqlDbType.Int); sp.Value = int.Parse(obj.ToString()); break; case "decimal": sp = new SqlParameter("@" + key, SqlDbType.Decimal); sp.Value = decimal.Parse(obj.ToString()); break; case "single": sp = new SqlParameter("@" + key, SqlDbType.Float); sp.Value = float.Parse(obj.ToString()); break; case "double": sp = new SqlParameter("@" + key, SqlDbType.Decimal); sp.Value = decimal.Parse(obj.ToString()); break; case "boolean": sp = new SqlParameter("@" + key, SqlDbType.Bit); if (obj.ToString().ToLower() == "true") { sp.Value = 1; } else if (obj.ToString().ToLower() == "false") { sp.Value = 0; } break; case "datetime": sp = new SqlParameter("@" + key, SqlDbType.DateTime); sp.Value = (DateTime)obj; break; case "string": if (System.Text.RegularExpressions.Regex.IsMatch(obj.ToString(), @"[^\x00-\xff]+")) { string name = key.ToLower(); if (name.IndexOf("remark") >= 0 || name.IndexOf("content") >= 0 || name.IndexOf("description") >= 0) { sp = new SqlParameter("@" + key, SqlDbType.NVarChar, 2000); } else { sp = new SqlParameter("@" + key, SqlDbType.VarChar, 50); } } else { sp = new SqlParameter("@" + key, SqlDbType.VarChar, 50); } sp.Value = obj.ToString(); break; case "char": sp = new SqlParameter("@" + key, SqlDbType.Char, 1); sp.Value = obj.ToString(); break; } return sp; } #endregion } /// <summary> /// 构造SQL命令和对应参数 /// </summary> public class CommandInfo { public string CommandText; public System.Data.Common.DbParameter[] Parameters; public CommandInfo(string sqlText, SqlParameter[] para) { this.CommandText = sqlText; this.Parameters = para; } } #region 分页类实体,借助存储过程实现 public class Pagination { public int CurrentPage { get; set; } public string Fields { get; set; } public string Filter { get; set; } public string Group { get; set; } public int PageSize { get; set; } public string PrimaryKey { get; set; } public string Sort { get; set; } public string Tables { get; set; } } /// <summary> /// RowNumber分页 /// </summary> public class PaginationByRowNumber { /// <summary> /// 表名 /// </summary> public string Table { get; set; } /// <summary> /// 排序 需要指明顺序 asc/desc /// </summary> public string Sort { get; set; } /// <summary> /// 当前页 /// </summary> public int CurrentPage { get; set; } /// <summary> /// 行数 /// </summary> public int PageSize { get; set; } /// <summary> /// 字段 /// </summary> public string Fields { get; set; } /// <summary> /// 条件 /// </summary> public string Filter { get; set; } } #endregion #region 使用存储过程时缓存参数 public sealed class SqlHelperParameterCache { private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); private SqlHelperParameterCache() { } public static void CacheParameterSet(string connectionString, string commandText, params SqlParameter[] commandParameters) { if ((connectionString == null) || (connectionString.Length == 0)) { throw new ArgumentNullException("connectionString"); } if ((commandText == null) || (commandText.Length == 0)) { throw new ArgumentNullException("commandText"); } string str = connectionString + ":" + commandText; paramCache[str] = commandParameters; } private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters) { SqlParameter[] parameterArray = new SqlParameter[originalParameters.Length]; int index = 0; int length = originalParameters.Length; while (index < length) { parameterArray[index] = (SqlParameter)((ICloneable)originalParameters[index]).Clone(); index++; } return parameterArray; } private static SqlParameter[] DiscoverSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter) { if (connection == null) { throw new ArgumentNullException("connection"); } if ((spName == null) || (spName.Length == 0)) { throw new ArgumentNullException("spName"); } SqlCommand command = new SqlCommand(spName, connection); command.CommandType = CommandType.StoredProcedure; connection.Open(); SqlCommandBuilder.DeriveParameters(command); connection.Close(); if (!includeReturnValueParameter) { command.Parameters.RemoveAt(0); } SqlParameter[] array = new SqlParameter[command.Parameters.Count]; command.Parameters.CopyTo(array, 0); foreach (SqlParameter parameter in array) { parameter.Value = DBNull.Value; } return array; } public static SqlParameter[] GetCachedParameterSet(string connectionString, string commandText) { if ((connectionString == null) || (connectionString.Length == 0)) { throw new ArgumentNullException("connectionString"); } if ((commandText == null) || (commandText.Length == 0)) { throw new ArgumentNullException("commandText"); } string str = connectionString + ":" + commandText; SqlParameter[] originalParameters = paramCache[str] as SqlParameter[]; if (originalParameters == null) { return null; } return CloneParameters(originalParameters); } internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName) { return GetSpParameterSet(connection, spName, false); } public static SqlParameter[] GetSpParameterSet(string connectionString, string spName) { return GetSpParameterSet(connectionString, spName, false); } internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter) { if (connection == null) { throw new ArgumentNullException("connection"); } using (SqlConnection connection2 = (SqlConnection)((ICloneable)connection).Clone()) { return GetSpParameterSetInternal(connection2, spName, includeReturnValueParameter); } } public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) { if ((connectionString == null) || (connectionString.Length == 0)) { throw new ArgumentNullException("connectionString"); } if ((spName == null) || (spName.Length == 0)) { throw new ArgumentNullException("spName"); } using (SqlConnection connection = new SqlConnection(connectionString)) { return GetSpParameterSetInternal(connection, spName, includeReturnValueParameter); } } private static SqlParameter[] GetSpParameterSetInternal(SqlConnection connection, string spName, bool includeReturnValueParameter) { if (connection == null) { throw new ArgumentNullException("connection"); } if ((spName == null) || (spName.Length == 0)) { throw new ArgumentNullException("spName"); } string str = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); SqlParameter[] originalParameters = paramCache[str] as SqlParameter[]; if (originalParameters == null) { SqlParameter[] parameterArray2 = DiscoverSpParameterSet(connection, spName, includeReturnValueParameter); paramCache[str] = parameterArray2; originalParameters = parameterArray2; } return CloneParameters(originalParameters); } } #endregion /// <summary> /// 创建SqlParameter /// </summary> public class CP { public class ColumnInfo { public string ColName { get; set; } public SqlDbType ColType { get; set; } public int ColLength { get; set; } public bool IsPrimary { get; set; } public string Description { get; set; } } /// <summary> /// 读取用户表及每个表字段信息保存到字典对象,加入缓存 /// </summary> /// <param name="specifyTable">指定表名,如果为空,则查询所有表</param> /// <param name="connStr">数据库连接串</param> /// <returns></returns> public static List<ColumnInfo> TC(string specifyTable, string connStr) { if (string.IsNullOrEmpty(specifyTable)) { return null; } var vl = HttpRuntime.Cache.Get("utable_" + specifyTable); if (vl == null) { List<ColumnInfo> p = new List<ColumnInfo>(); using (SqlConnection conn = new SqlConnection(connStr)) { StringBuilder sb = new StringBuilder(1000); sb.Append("SELECT a.name,(case when (SELECT count(*) FROM sysobjects WHERE (name in (SELECT name FROM sysindexes WHERE (id = a.id) AND (indid in (SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid in (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = 'PK'))>0 then '1' else '0' end) isprimary,b.name [type],COLUMNPROPERTY(a.id,a.name,'PRECISION') as [length],isnull(g.value,'') as [description] FROM syscolumns a "); sb.Append("left join systypes b on a.xtype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'"); sb.Append("left join syscomments e on a.cdefault=e.id left join sys.extended_properties g on a.id=g.major_id AND a.colid = g.minor_id where d.name =@tname order by a.id,a.colorder"); conn.Open(); SqlCommand cmd = new SqlCommand(sb.ToString(), conn); cmd.Parameters.Add(new SqlParameter("@tname", SqlDbType.VarChar, 30)); cmd.Parameters[0].Value = specifyTable; SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); sda.Fill(ds); DataTable dt = ds.Tables[0]; int count = dt.Rows.Count; if (count > 0) { for (int i = 0; i < count; i++) { ColumnInfo item = new ColumnInfo() { ColName = dt.Rows[i]["name"].ToString(), ColLength = int.Parse(dt.Rows[i]["length"].ToString()), ColType = StringToSqlType(dt.Rows[i]["type"].ToString()), IsPrimary = (dt.Rows[i]["isprimary"].ToString() == "1" ? true : false), Description = dt.Rows[i]["description"].ToString() }; p.Add(item); } HttpRuntime.Cache.Insert("utable_" + specifyTable, p, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); } } return p; } else { return (List<ColumnInfo>)HttpRuntime.Cache["utable_" + specifyTable]; } } /// <summary> /// 读取用户表及每个表字段信息保存到字典对象,加入缓存 只针对视图 /// </summary> /// <param name="specifyTable">指定表名,如果为空,则查询所有表</param> /// <param name="connStr">数据库连接串</param> /// <returns></returns> public static List<ColumnInfo> TCV(string specifyTable, string connStr) { if (string.IsNullOrEmpty(specifyTable)) { return null; } if (HttpRuntime.Cache["utable_" + specifyTable] == null) { List<ColumnInfo> p = new List<ColumnInfo>(); using (SqlConnection conn = new SqlConnection(connStr)) { StringBuilder sb = new StringBuilder(1000); sb.Append("select c.name ,t.name as type ,COLUMNPROPERTY(c.id,c.name,'PRECISION') as length "); sb.Append("from syscolumns c inner join systypes t on c.xusertype=t.xusertype "); sb.Append("where objectproperty(c.id,'IsView')=1 and c.id=object_id(@tname) "); conn.Open(); SqlCommand cmd = new SqlCommand(sb.ToString(), conn); cmd.Parameters.Add(new SqlParameter("@tname", SqlDbType.VarChar, 30)); cmd.Parameters[0].Value = specifyTable; SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); sda.Fill(ds); DataTable dt = ds.Tables[0]; int count = dt.Rows.Count; if (count > 0) { for (int i = 0; i < count; i++) { ColumnInfo item = new ColumnInfo() { ColName = dt.Rows[i]["name"].ToString(), ColLength = int.Parse(dt.Rows[i]["length"].ToString()), ColType = StringToSqlType(dt.Rows[i]["type"].ToString()), IsPrimary = false, Description = "" }; p.Add(item); } HttpRuntime.Cache.Insert("utable_" + specifyTable, p, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); } } return p; } else { return (List<ColumnInfo>)HttpRuntime.Cache["utable_" + specifyTable]; } } //SqlServer数据库类型转换方法 public static SqlDbType StringToSqlType(string String) { SqlDbType dbType = SqlDbType.Variant;//默认为Object switch (String) { case "int": dbType = SqlDbType.Int; break; case "varchar": dbType = SqlDbType.VarChar; break; case "bit": dbType = SqlDbType.Bit; break; case "datetime": dbType = SqlDbType.DateTime; break; case "decimal": dbType = SqlDbType.Decimal; break; case "float": dbType = SqlDbType.Float; break; case "image": dbType = SqlDbType.Image; break; case "money": dbType = SqlDbType.Money; break; case "ntext": dbType = SqlDbType.NText; break; case "nvarchar": dbType = SqlDbType.NVarChar; break; case "smalldatetime": dbType = SqlDbType.SmallDateTime; break; case "smallint": dbType = SqlDbType.SmallInt; break; case "text": dbType = SqlDbType.Text; break; case "bigint": dbType = SqlDbType.BigInt; break; case "binary": dbType = SqlDbType.Binary; break; case "char": dbType = SqlDbType.Char; break; case "nchar": dbType = SqlDbType.NChar; break; case "numeric": dbType = SqlDbType.Decimal; break; case "real": dbType = SqlDbType.Real; break; case "smallmoney": dbType = SqlDbType.SmallMoney; break; case "sql_variant": dbType = SqlDbType.Variant; break; case "timestamp": dbType = SqlDbType.Timestamp; break; case "tinyint": dbType = SqlDbType.TinyInt; break; case "uniqueidentifier": dbType = SqlDbType.UniqueIdentifier; break; case "varbinary": dbType = SqlDbType.VarBinary; break; case "xml": dbType = SqlDbType.Xml; break; } return dbType; } #region 建立一个参数 /// <summary> /// 根据表列信息集合和表对应实体类所属某个属性返回一个SQL参数 /// </summary> /// <typeparam name="item">表列信息集合</typeparam> /// <param name="property">属性</param> /// <param name="v">属性对应值</param> /// <param name="pd">参数方向</param> /// <returns>一个SQL参数,已经初始化</returns> public static SqlParameter cPa(ColumnInfo item, object v, ParameterDirection pd) { if (item == null) { return null; } SqlParameter sp = null; if (item != null) { sp = new SqlParameter("@" + item.ColName, item.ColType, item.ColLength); sp.Direction = pd; sp.Value = v; } return sp; } /// <summary> /// 根据表列信息集合和表对应实体类所属某个属性返回一个SQL参数 /// </summary> /// <typeparam name="item">表列信息集合</typeparam> /// <param name="property">属性</param> /// <param name="v">属性对应值</param> /// <returns>一个SQL参数,已经初始化</returns> public static SqlParameter cPa(ColumnInfo item, object v) { if (item == null) { return null; } SqlParameter sp = null; if (item != null) { sp = new SqlParameter("@" + item.ColName, item.ColType, item.ColLength); sp.Direction = ParameterDirection.Input; sp.Value = v; } return sp; } #endregion /// <summary> /// Author:付裕 /// Date: 2014-09-19 /// Desc: DataTable与泛型转换类 /// </summary> public class WorkCommon { /// <summary> /// DataTable Convert To List<T> /// </summary> /// <typeparam name="T">实体</typeparam> /// <param name="dt">数据集合</param> /// <returns>泛型集合</returns> public static List<T> ConvertTo<T>(DataTable dt) where T : new() { if (dt == null) return null; if (dt.Rows.Count <= 0) return null; List<T> list = new List<T>(); try { List<string> columnsName = new List<string>(); foreach (DataColumn dataColumn in dt.Columns) { columnsName.Add(dataColumn.ColumnName);//得到所有的表头 } list = dt.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsName)); //转换 return list; } catch { return null; } } /// <summary> /// 转换函数 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="row"></param> /// <param name="columnsName"></param> /// <returns></returns> private static T getObject<T>(DataRow row, List<string> columnsName) where T : new() { T obj = new T(); try { string columnname = ""; string value = ""; PropertyInfo[] Properties = typeof(T).GetProperties(); foreach (PropertyInfo objProperty in Properties) //遍历T的属性 { columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower()); //寻找可以匹配的表头名称 if (!string.IsNullOrEmpty(columnname)) { value = row[columnname].ToString(); if (!string.IsNullOrEmpty(value)) { if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) //存在匹配的表头 { value = row[columnname].ToString().Replace("$", "").Replace(",", ""); //从dataRow中提取数据 objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null); //赋值操作 } else { value = row[columnname].ToString().Replace("%", ""); //存在匹配的表头 objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);//赋值操作 } } } } return obj; } catch { return obj; } } /// <summary> /// 将泛型集合类转换成DataTable /// </summary> /// <typeparam name="T">集合项类型</typeparam> /// <param name="list">集合</param> /// <param name="propertyName">需要返回的列的列名</param> /// <returns>数据集(表)</returns> public static DataTable ListToDataTable<T>(IList<T> list, params string[] propertyName) { List<string> propertyNameList = new List<string>(); if (propertyName != null) propertyNameList.AddRange(propertyName); DataTable result = new DataTable(); if (list != null && list.Count > 0) { PropertyInfo[] propertys = list[0].GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { if (propertyNameList.Count == 0) { result.Columns.Add(pi.Name, pi.PropertyType); } else { if (propertyNameList.Contains(pi.Name)) result.Columns.Add(pi.Name, pi.PropertyType); } } for (int i = 0; i < list.Count; i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in propertys) { if (propertyNameList.Count == 0) { object obj = pi.GetValue(list[i], null); tempList.Add(obj); } else { if (propertyNameList.Contains(pi.Name)) { object obj = pi.GetValue(list[i], null); tempList.Add(obj); } } } object[] array = tempList.ToArray(); result.LoadDataRow(array, true); } } return result; } } }