利用特性、泛型、反射生成sql操作语句(待修改
1、特性编写
/// <summary>/// ExcludeFieldAttribute/// /// 修改纪录/// /// /// /// 版本:1.0////// <author>/// <name>Seven7</name>/// <date></date>/// </author> /// </summary>[AttributeUsage(AttributeTargets.Property)][Serializable]public class ExcludeFieldAttribute : Attribute{/// <summary>/// 获取元数据的特性/// </summary>/// <param name="item"></param>/// <returns></returns>public static ExcludeFieldAttribute GetAttribute(MemberInfo item){var excludeFieldAttribute = (ExcludeFieldAttribute)GetCustomAttribute(item, typeof(ExcludeFieldAttribute));return excludeFieldAttribute;}}/// <summary>/// 表信息/// </summary>[AttributeUsage(AttributeTargets.Class)][System.Serializable]public class TableInfoAttribute : Attribute{public TableInfoAttribute(string tableName){TableName = tableName;}/// <summary>/// 数据库中表的名称/// </summary>public string TableName { get; set; }/// <summary>/// 获取元数据的特性/// </summary>/// <param name="item"></param>/// <returns></returns>public static TableInfoAttribute GetAttribute(Type item){var excludeFieldAttribute = (TableInfoAttribute)GetCustomAttribute(item, typeof(TableInfoAttribute));return excludeFieldAttribute;}}/// <summary>/// 表示联盟在自动生成SQL语句时,不处理该字段/// </summary>[AttributeUsage(AttributeTargets.Property)][System.Serializable]public class UnionExcludeFieldAttribute : Attribute{/// <summary>/// 获取元数据的特性/// </summary>/// <param name="item"></param>/// <returns></returns>public static UnionExcludeFieldAttribute GetAttribute(MemberInfo item){var UnionexcludeFieldAttribute = (UnionExcludeFieldAttribute)GetCustomAttribute(item, typeof(UnionExcludeFieldAttribute));return UnionexcludeFieldAttribute;}}/// <summary>/// 用于,对原始字段做一些处理之后,得到新的字段/// </summary>[AttributeUsage(AttributeTargets.Property)][System.Serializable]public class ExtendedAttribute : Attribute{public ExtendedAttribute(string extendedSql){ExtendedSql = extendedSql;}/// <summary>/// 扩展语句/// </summary>public string ExtendedSql { get; set; }private string _mysqlExtend = null;/// <summary>/// mysql版/// </summary>public string ExtendedMySql{get{return _mysqlExtend ?? ExtendedSql;}set { _mysqlExtend = value; }}public static ExtendedAttribute GetAttribute(MemberInfo item){var extendedAttribute = (ExtendedAttribute)GetCustomAttribute(item, typeof(ExtendedAttribute));return extendedAttribute;}}/// <summary>/// 标记字段为自增长类型的字段/// </summary>[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)][System.Serializable]public class IdentityAttribute : Attribute{public static IdentityAttribute GetAttribute(MemberInfo member){return (IdentityAttribute)GetCustomAttribute(member, typeof(IdentityAttribute));}}[AttributeUsage(AttributeTargets.Property)][System.Serializable]public class RefFieldAttribute : Attribute{public RefFieldAttribute(){}/// <summary>/// </summary>/// <param name="masterTableField">主表的外键</param>/// <param name="refTableName">引用表名称</param>/// <param name="refTableKey">引用表主键</param>public RefFieldAttribute(string masterTableField, string refTableName, string refTableKey){RefTableName = refTableName;RefTableKey = refTableKey;MasterTableField = masterTableField;}/// <summary>/// 引用表的名称/// </summary>public string RefTableName { get; set; }/// <summary>/// 引用表的键/// </summary>public string RefTableKey { get; set; }/// <summary>/// 主表的外键/// </summary>public string MasterTableField { get; set; }/// <summary>/// 引用的字段/// </summary>public string RefFieldName { get; set; }public static RefFieldAttribute GetAttribute(MemberInfo item){var refFieldAttribute = (RefFieldAttribute)GetCustomAttribute(item, typeof(RefFieldAttribute));return refFieldAttribute;}}[System.Serializable]public class FieldDescriptionAttribute : Attribute{public string FieldName { get; set; }public FieldDescriptionAttribute(string fieldName){FieldName = fieldName;}public static FieldDescriptionAttribute GetFieldDescriptionAttribute(MemberInfo element){var fieldDesc = (FieldDescriptionAttribute)GetCustomAttribute(element, typeof(FieldDescriptionAttribute));return fieldDesc;}}/// <summary>/// 缓存策略/// </summary>[AttributeUsage(AttributeTargets.Class)]public class DataCacheStrategyAttribute : Attribute{private EntityCacheExpirationPolicies expirationPolicy = EntityCacheExpirationPolicies.Normal;/// <summary>/// 是否使用缓存/// </summary>public bool EnableCache { get; private set; }public bool ListCache { get; set; }/// <summary>/// 缓存过期策略/// </summary>public EntityCacheExpirationPolicies ExpirationPolicy{get{return this.expirationPolicy;}set{this.expirationPolicy = value;}}public DataCacheStrategyAttribute(bool enableCache, bool listCache){EnableCache = enableCache;ListCache = listCache;}public static DataCacheStrategyAttribute GetStrategyAttribute(Type type){var attr = (DataCacheStrategyAttribute)GetCustomAttribute(type, typeof(DataCacheStrategyAttribute));return attr;}}/// <summary>/// 实体缓存期限类型/// </summary>public enum EntityCacheExpirationPolicies{/// <summary>/// 稳定数据 /// </summary>/// <remarks>/// 例如: Area/School/// </remarks>Stable = 1,/// <summary>/// 常用的单个实体/// </summary>/// <remarks>/// 例如: 用户、圈子/// </remarks>Usual = 3,/// <summary>/// 单个实体/// </summary>/// <remarks>/// 例如: 博文、帖子/// </remarks>Normal = 5}
2、其他辅助类
/// <summary>/// DbOperation/// 有关数据库操作的定义。/// 修改纪录/// /// /// /// 版本:1.0////// <author>/// <name>Seven7</name>/// <date></date>/// </author> /// </summary>public enum DbOperation{/// <summary>/// 查询/// </summary>Select,/// <summary>/// 插入/// </summary>Insert,/// <summary>/// 更新/// </summary>Update,/// <summary>/// 删除/// </summary>Delete,/// <summary>/// 截取/// </summary>Truncate}public enum DbType{/// <summary>/// 数据库类型:Oracle/// </summary>Oracle,/// <summary>/// 数据库类型:SqlServer/// </summary>SqlServer,/// <summary>/// 数据库类型:Access/// </summary>Access,/// <summary>/// 数据库类型:DB2/// </summary>DB2,/// <summary>/// 数据库类型:MySql/// </summary>MySql,/// <summary>/// 数据库类型:SQLite/// </summary>SQLite}public class ConntionObject{//Data Source=.;Initial Catalog=master;User ID=sa//Data Source=.;Initial Catalog=master;Integrated Security=True/// <summary>/// 连接地址/// </summary>public string DataSource { get; set; }/// <summary>/// 连接数据库/// </summary>public string InitialCatalog { get; set; }/// <summary>/// 连接用户/// </summary>public string UserId { get; set; }/// <summary>/// 连接密码/// </summary>public string Password { get; set; }/// <summary>/// 连接方式(wondows/用户)/// </summary>public bool SSPI { get; set; }/// <summary>/// /// </summary>public int Priority { get; set; }/// <summary>/// 是否开启连接池的限制/// </summary>public bool Pooling { get; set; }/// <summary>/// 最小连接池/// </summary>public int MinPoolSize { get; set; }/// <summary>/// 最大连接池/// </summary>public int MaxPoolSize { get; set; }/// <summary>/// 连接时间/// </summary>private long connectTimeout = 999;public long ConnectTimeout{get { return connectTimeout; }set { connectTimeout = value; }}}public class PageHelp{/// <summary>/// 当前页数/// </summary>private long currPage = 1;/// <summary>/// 总页数/// </summary>private long totalPage = Int32.MaxValue;/// <summary>/// 总行数/// </summary>private long totalRows=0;/// <summary>/// 每页显示的行数/// </summary>private long rows;//private List<T> items;/// <summary>/// 当页的开始行/// </summary>private long upperLimit;/// <summary>/// 当页的末行/// </summary>private long lowerLimit;/// <summary>/// 返回当前页数/// </summary>public long CurrPage{get{this.currPage = currPage >= TotalPage ? TotalPage: currPage;this.currPage = currPage <= 0 ? 1 : currPage;return currPage;}set { currPage = value; }}/// <summary>/// 总页数/// </summary>public long TotalRows{get{return totalRows}set{totalPage = value < 1 ? 1 :value;}}/// <summary>/// 总行数/// </summary>public long TotalPage{get{return (totalRows - 1) / Rows + 1;}}/// <summary>/// 显示行数/// </summary>public long Rows{get { return rows; }set { rows = value; }}/*/// <summary>/// 每页集合/// </summary>public List<T> Items {get { return items; }set { items = value; }}*//// <summary>/// 当页最大行数号/// </summary>public long UpperLimit{get{this.upperLimit = CurrPage * Rows;return this.upperLimit;}set { upperLimit = value; }}/// <summary>/// 当页最小行数号/// </summary>public long LowerLimit{get{this.lowerLimit = (CurrPage - 1) * Rows;return this.lowerLimit;}set { lowerLimit = value; }}}
3、生成sql语句
public class SqlString{#region 字段private static SqlString _sqlStr = new SqlString();public static SqlString SqlStr{get{return _sqlStr;}}private string _truncateSql = @"TRUNCATE TABLE {0} ";/// <summary>/// 分页查询的外部查询语句/// <para>索引0:实际查询语句</para>/// <para>索引1:排序规则</para>/// <para>索引2:start</para>/// <para>索引3:end</para>/// </summary>private string _selectSqlString = @" SELECT {4} FROM ( SELECT ROW_NUMBER() OVER (ORDER BY {0} ) AS RowIndex , *FROM ( {1} ) a) v WHERE v.RowIndex BETWEEN {2} AND {3} ";private string _deleteSqlString = @"DELETE FROM {0} ";private string _updateSqlString = @"UPDATE {0} SET {1} WHERE {2} ";private string _insertSqlString = @"INSERT INTO {0} ({1}) VALUES ({2})";private string _identitySqlString = @" SELECT @@Identity AS ID ";private string _paramPrefix = @"@";public DbType _dbType { get; set; }/// <summary>/// 完整sql/// </summary>/// <param name="sql"></param>/// <returns></returns>public string Recombine(string sql){switch (_dbType){case DbType.SqlServer:break;case DbType.Oracle:sql = sql.Replace("@", _paramPrefix);sql = sql.Replace("isnull(", "NVL(").Replace("ISNULL(", "NVL(").Replace("getDate()", "SYSDATE").Replace("getdate()", "SYSDATE").Replace("GETDATE()", "SYSDATE");break;case DbType.MySql:sql = sql.Replace("isnull(", "ifnull(").Replace("ISNULL(", "ifnull(").Replace("getDate()", "now()").Replace("getdate()", "now()").Replace("GETDATE()", "now()");break;}return sql;}#endregion#region 删除/// <summary>/// 数据库截断/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public string TruncateToSql<T>(){Type type = typeof(T);TableInfoAttribute tableInfoAttribute = TableInfoAttribute.GetAttribute(type);string tableName = tableInfoAttribute != null ? tableInfoAttribute.TableName : type.Name;string truncateSql = String.Format(_truncateSql, tableName);return Recombine(truncateSql);}/// <summary>/// 根据sql条件删除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="where"></param>/// <returns></returns>public string DeleteToSql<T>(string where){if (!string.IsNullOrEmpty(where)){throw new Exception("删除条件不能为空");}if (!where.Trim().StartsWith("where", StringComparison.InvariantCultureIgnoreCase)){where = " WHERE " + where;}Type type = typeof(T);TableInfoAttribute tableInfoAttribute = TableInfoAttribute.GetAttribute(type);string tableName = tableInfoAttribute != null ? tableInfoAttribute.TableName : type.Name;string deleteSql = _deleteSqlString + tableName + " " + where;return Recombine(deleteSql);}#endregion#region 添加/// <summary>/// /// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity">参数对象</param>/// <param name="dbType">数据库类型</param>/// <param name="isValue">是否传递Parameters参数</param>/// <param name="tableName">table名称</param>/// <returns></returns>public string AddToSql<T>(dynamic entity, DbType dbType = DbType.SqlServer, bool isValue = false, string tableName = null){string insert = AddToSql(entity, dbType, isValue);Type t = typeof(T);Type t2 = entity.GetType();if (t == typeof(int) && string.IsNullOrEmpty(tableName)){insert = insert.Replace(t2.Name, tableName);}else{insert = insert.Replace(t2.Name, t.Name);}return insert;}public string AddToSql(string tableName, dynamic entity, DbType dbType = DbType.SqlServer, bool isValue = false){return AddToSql<int>(entity, dbType, isValue, tableName);}public string AddToSql(dynamic entity, DbType dbType = DbType.SqlServer, bool isValue = false){if (entity == null) throw new Exception(entity.GetType().Name + "类型为空!");Type type = entity.GetType();TableInfoAttribute tableInfoAttribute = TableInfoAttribute.GetAttribute(type);string tableName = tableInfoAttribute != null ? tableInfoAttribute.TableName : type.Name;int count = 0;StringBuilder key = new StringBuilder();StringBuilder value = new StringBuilder();StringBuilder sql = new StringBuilder();bool pk = false;foreach (PropertyInfo item in type.GetProperties()){if (ExcludeFieldAttribute.GetAttribute(item) != null) continue;//自增属性不处理if (IdentityAttribute.GetAttribute(item) != null){pk = true;continue;}//自增长列不处理object values = item.GetValue(entity, null);if (values == null || values == DBNull.Value) continue;//if(RequiredAttribute.GetCustomAttribute(item.Module,item.GetType())==null)// throw new Exception("此列属性为必填项");if (count != 0){key.Append(',');value.Append(',');}key.Append(item.Name);if (isValue){value.Append(item.GetValue(entity));}else{value.Append('@' + item.Name);}count++;}sql.Append(string.Format(_insertSqlString, tableName, key, value));sql.Append(";");if (pk){switch (dbType){case DbType.Oracle:break;case DbType.SqlServer:sql.AppendFormat(_identitySqlString);break;case DbType.MySql:sql.AppendFormat(";");sql.AppendLine(_identitySqlString);break;}}return Recombine(sql.ToString());}/// <summary>/// 删除一组对象/// </summary>/// <param name="entities"></param>/// <param name="dbType"></param>/// <param name="isValue"></param>/// <returns></returns>public string AddsToSql(ICollection entities, DbType dbType, bool isValue/*,List<KeyValuePair<dynamic,string>> dic*/){if (entities == null){throw new ArgumentNullException("entities", "列表为空");}StringBuilder insert = new StringBuilder();foreach (object entity in entities){if (dbType == DbType.Oracle) insert.Append("BEGIN");if (entity == null) continue;//dic.Add(new KeyValuePair<dynamic, string> (entity, AddToSql(entity, dbType)));insert.Append(AddToSql(entity, dbType));if (dbType == DbType.Oracle) insert.Append("END");}return Recombine(insert.ToString());}#endregion/// <summary>/// 根据不同数据库更改select语句 在构造函数中调用/// </summary>/// <param name="dataName"></param>/// <param name="_dbType"></param>internal void SetSelect(DbType _dbType){this._dbType = _dbType;switch (_dbType) {case DbType.Oracle:_selectSqlString = @"select * from (select @rownum:=@rownum+1 as RowIndex, a.* from ({0} order by {1}) a ,(select @rownum:=0) b ) t where t.RowIndex BETWEEN {2} AND {3}";_identitySqlString = "select LAST_INSERT_ID() as ID;";break;case DbType.MySql:_selectSqlString = @"select * from {0} where {1} limit {2},{3}";_identitySqlString = @"SELECT LAST_INSERT_ID()";break;default:break;}if (_dbType == DbType.Oracle){_paramPrefix = ":";}}private string UpdateToSql(dynamic entity, bool isValue = false){if (entity == null) throw new Exception(entity.GetType().Name + "类型为空!");Type type = entity.GetType();TableInfoAttribute tableInfoAttribute = TableInfoAttribute.GetAttribute(type);string tableName = tableInfoAttribute != null ? tableInfoAttribute.TableName : type.Name;StringBuilder set = new StringBuilder();int count = 0;foreach (PropertyInfo item in type.GetProperties()){if (ExcludeFieldAttribute.GetAttribute(item) != null) continue;//自增属性不处理if (IdentityAttribute.GetAttribute(item) != null) continue;if (count != 0) set.Append(",");if (isValue){set.AppendFormat("{0} = '{0}'", item.GetValue(entity));}else{set.AppendFormat("{0} = @{0}", item.Name);}count++;}return Recombine(string.Format(_updateSqlString, tableName, set));}public string UpdateToSql(dynamic entity, string where = "1=1", bool isValue = false){//Type t = entity.GetType();//PropertyInfo[] info = t.GetProperties();//PropertyInfo pk;if (!where.StartsWith("where", StringComparison.InvariantCultureIgnoreCase)){where = " where " + where;}return UpdateToSql(entity, isValue) + Recombine(where);}/// <summary>/// 批量删除/// </summary>/// <param name="enumerable">对象:修改条件</param>/// <param name="isValue">是否传递Parameters参数</param>/// <returns></returns>public string UpdatesToSql(List<KeyValuePair<dynamic, string>> enumerable, bool isValue=false){ StringBuilder str = new StringBuilder();foreach (KeyValuePair<dynamic, string> k in enumerable){str.Append(UpdateToSql(k.Key, k.Value, isValue) + ";");}return Recombine(str.ToString());}/// <summary>/// 查询/// </summary>/// <param name="type"></param>/// <param name="where"></param>/// <param name="dbType"></param>/// <returns></returns>public string SelectToSql(Type type, string where, DbType dbType = DbType.SqlServer){if (!string.IsNullOrEmpty(where)){if (!where.TrimStart().StartsWith("WHERE", StringComparison.CurrentCultureIgnoreCase)){where = "Where " + where;}}StringBuilder sql = new StringBuilder("SELECT ");List<TablePrimary> tablePrimary = TablePrimary.GetTablePrimary(type);List<TablePrimary> tables = TablePrimary.GetDistinct(tablePrimary);foreach (TablePrimary v in tablePrimary){ //是否有外键的字段if (tables.Count <= 1){if (!v.IsExtend) {sql.AppendFormat("{0},", v.FieldName);}}else{if (string.IsNullOrEmpty(v.MasterTableField)){sql.AppendFormat("{0}.{1},", v.TableName, v.FieldName);}else{sql.AppendFormat("{0}.{1} {2},", v.TableName, v.FieldName, v.FieldAlias);}}}//添加的sql语句PropertyInfo[] infos = type.GetProperties();foreach (PropertyInfo pro in infos){ExtendedAttribute extended = ExtendedAttribute.GetAttribute(pro);if (extended != null){var extSql = (dbType == DbType.MySql) ? extended.ExtendedMySql : extended.ExtendedSql;sql.Append("(" + extSql + ") " + pro.Name + ",");}}TableInfoAttribute tableInfo = TableInfoAttribute.GetAttribute(type);string tableName = tableInfo == null ? type.Name : tableInfo.TableName, joinOn = "";sql = sql.Remove(sql.Length - 1, 1);sql.AppendLine();sql.AppendFormat(" FROM {0} ", tableName);//连表foreach (TablePrimary v in tables){if (!string.IsNullOrEmpty(v.MasterTableField)){joinOn = string.Format(" {0}.{1} = {2}.{3} ", tableName, v.MasterTableField, v.TableName, v.RelateField);sql.AppendFormat("JOIN {0} ON ({1}) ", v.TableName, joinOn);}}sql.Append(where);return Recombine(sql.ToString());}/// <summary>/// 根据主键进行查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>public string SqlectByIdToSql<T>(long id) {Type t = typeof(T);PropertyInfo info = t.GetProperties().First(p => IdentityAttribute.GetAttribute(p)!=null);if (info != null) {string str = info.Name + "=" + id;return SelectToSql(t, str); }throw new Exception("No Find Identity");}public string SelectJoinSql<T>(PageHelp page, string strWhere = "1=1", string orderBy = "", DbType dbType = DbType.SqlServer){return Recombine(SelectSql(typeof(T), page, strWhere, orderBy, dbType));}private string SelectSql(Type t, PageHelp page, string strWhere = "1=1", string orderBy = "", DbType dbType = DbType.SqlServer,bool IsCount=false){if (string.IsNullOrEmpty(strWhere))strWhere = "1=1";Type type = t;PropertyInfo pk = type.GetProperties().FirstOrDefault(p => IdentityAttribute.GetAttribute(p) != null);if (string.IsNullOrEmpty(orderBy)){if (pk != null)orderBy = pk.Name + " DESC ";else throw new Exception("未设置排序字段");}if (orderBy.Trim().StartsWith("ORDER BY", StringComparison.CurrentCultureIgnoreCase)){orderBy = orderBy.ToLower().Replace("order by", " ");}string dataSql = string.Format(_selectSqlString, SelectToSql(t, strWhere), orderBy, page.LowerLimit, page.UpperLimit, IsCount ? "Count(1)" : "*");return Recombine(dataSql);}/// <summary>/// 更新指定表的指定字段/// </summary>/// <param name="tableName">表名称</param>/// <param name="fieldName">字段名称</param>/// <param name="value">字段值</param>/// <param name="where">更新条件</param>/// <returns></returns>public string UpdateField(string tableName, string fieldName, string value, string where){if (!where.TrimStart().StartsWith("where", StringComparison.OrdinalIgnoreCase)){where = " WHERE " + where;}value = "'" + value + "'";string updateSql = string.Format("UPDATE {0} SET {1}={2} {3}", tableName, fieldName, value, where);return updateSql;}/// <summary>/// 更新字段/// </summary>/// <param name="tableName">表名</param>/// <param name="fieldvalues">字段名称和字段值的键值对集合</param>/// <param name="where">更新条件</param>/// <returns></returns>public string UpdateFields(string tableName, List<KeyValuePair<string, string>> fieldvalues, string where){if (!string.IsNullOrEmpty(where)){if (!where.TrimStart().StartsWith("where", StringComparison.CurrentCultureIgnoreCase)){where = " WHERE " + where;}}StringBuilder updateSql = new StringBuilder().AppendFormat("UPDATE {0} SET ", tableName);for (int i = 0; i < fieldvalues.Count; i++){string value = fieldvalues[i].Value == null ? "NULL" : string.Format("'{0}'", fieldvalues[i].Value);updateSql.AppendFormat("{0}={1}", fieldvalues[i].Key, value);if (i < fieldvalues.Count - 1)updateSql.Append(",");updateSql.AppendLine();}updateSql.Append(where);return updateSql.ToString();}}
4、Ado.net操作(未对sql、数据进行缓存)
/// <summary>/// IData/// /// 修改纪录/// /// /// /// 版本:1.0////// <author>/// <name>Seven7</name>/// <date></date>/// </author> /// </summary>public interface IDataBase{/// <summary>/// 传送sql语句,执行增删改操作/// </summary>/// <param name="sql">完整sql语句</param>/// <returns>受影响行数</returns>int ExecuteSql(string sql);/// <summary>/// 返回首行首列数据/// </summary>/// <param name="sql">完整sql语句</param>/// <returns>受影响行数</returns>int ExecuteScalarSql(string sql);/// <summary>/// 删除实体对象/// </summary>/// <typeparam name="T">实体对象</typeparam>/// <param name="where">删除sql条件</param>/// <returns>受影响行数</returns>int DelectEntity<T>(string where);/// <summary>/// 删除全部数据,自增列重新排序/// </summary>/// <typeparam name="T">实体对象</typeparam>/// <returns>受影响行数</returns>int TruncateTable<T>();/// <summary>/// 添加单个对象/// </summary>/// <param name="entity">实体对象</param>/// <returns>受影响行数</returns>int AddEntity<T>(dynamic entity);/// <summary>/// 添加单个对象/// </summary>/// <param name="tableName">表名</param>/// <param name="entity">实体对象</param>/// <returns>受影响行数</returns>int AddEntity(string tableName, object entity);/// <summary>/// 添加单个对象/// </summary>/// <param name="entity">实体对象</param>/// <returns>受影响行数</returns>int AddEntity(BaseEntity entity);/// <summary>/// 添加一组对象/// </summary>/// <param name="entities">添加集合</param>/// <returns>受影响行数</returns>int AddEntities(ICollection entities);/// <summary>/// 更新单个对象/// </summary>/// <param name="entity"></param>/// <param name="primaryKeyField"></param>/// <returns></returns>int UpdateEntity(object entity);/// <summary>/// 更新一组对象/// </summary>/// <param name="entity"></param>/// <param name="primaryKeyField"></param>/// <returns></returns>int UpdatesEntity(List<KeyValuePair<dynamic, string>> enumerable);/// <summary>/// 获取对象的集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>List<T> GetListEntity<T>(string sql, object entity, CommandType commandType);/// <summary>/// 获取单个对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>T GetEntity<T>(string sql, object entity);/// <summary>/// 获取分页数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="page"></param>/// <param name="strWhere"></param>/// <param name="orderBy"></param>/// <param name="entity"></param>/// <returns></returns>List<T> GetListEntity<T>(PageHelp page, string strWhere = "1=1", string orderBy = "", object entity = null);/// <summary>/// 获取赛选后的数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="strWhere"></param>/// <param name="entity"></param>/// <returns></returns>List<T> GetListEntity<T>(string strWhere = "1=1", object entity = null);/// <summary>/// 获取单个实例对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>T GetEntityByID<T>(long id);/// <summary>/// 获取数据的总个数/// </summary>/// <typeparam name="T"></typeparam>/// <param name="strWhere"></param>/// <param name="orderBy"></param>/// <param name="entity"></param>/// <returns></returns>long GetEntityCount<T>(string strWhere = "1=1", string orderBy = "", object entity = null);}/// <summary>/// DataBase/// /// 修改纪录/// /// /// /// 版本:1.0////// <author>/// <name>Seven7</name>/// <date></date>/// </author> /// </summary>public class DataBase : IDataBase{#region 字段与构造函数#region 字段///数据库的命名空间名private string _connProviderName;/// 连接的字符串,注:在配置文件中的连接字符串要进行加密 private readonly string _connString;///各个数据库库的抽象工厂private DbProviderFactory _factory;///生产Sql语句的对象SqlString sqlstr = SqlString.SqlStr;///数据库类型private DbType _dbType = DbType.SqlServer;///数据库操作类型private DbOperation _ddlType = DbOperation.Insert;///委托private delegate dynamic ExecuteTranc(IDbCommand comm);#endregion#region 构造函数/// <summary>/// /// </summary>public DataBase(DbType dbType){_connString = ConfigurationManager.ConnectionStrings[Enum.GetName(typeof(DbType), dbType)].ConnectionString;SetSql(dbType);}/// <summary>/// /// </summary>/// <param name="connSql"></param>/// <param name="dbType"></param>public DataBase(ConntionObject connSql, DbType dbType){SetSql(dbType);DbConnectionStringBuilder builder = _factory.CreateConnectionStringBuilder();builder["Data Source"] = connSql.DataSource;builder["integrated Security"] = connSql.SSPI;builder["Initial Catalog"] = connSql.InitialCatalog;// builder["Connect Timeout"] = connSql.ConnectTimeout;if (connSql.Pooling){builder["Pooling"] = connSql.Pooling;builder["Min Pool Size"] = connSql.MinPoolSize;builder["Max Pool Size"] = connSql.MaxPoolSize;}if (connSql.SSPI){builder["Integrated Security"] = "SSPI";}else {builder["User Id"] = connSql.UserId;builder["Password"] = connSql.Password;}_connString = builder.ConnectionString;}/// <summary>/// 参数值要与web.config保持一致/// </summary>public void SetSql(DbType dbType){_connProviderName = GetProviderName(dbType);_factory = DbProviderFactories.GetFactory(_connProviderName);sqlstr.SetSelect(dbType);if (_connProviderName.StartsWith("Oracle")){ExecuteSql("ALTER SESSION SET NLS_COMP='LINGUISTIC'");ExecuteSql("ALTER SESSION SET NLS_SORT='BINARY_CI'");}sqlstr._dbType = dbType;}/// <summary>/// 获取命名空间字符/// </summary>/// <param name="dbType"></param>/// <returns></returns>private string GetProviderName(DbType dbType){switch (dbType){case DbType.SqlServer:return "System.Data.SqlClient";case DbType.Oracle:return "System.Data.OracleClient;";case DbType.MySql:return "MySql.Data.MySqlClient;";default:return "";}}#endregion#endregion#region 获取ADO对象/// <summary>/// 获取链接数据对象/// </summary>/// <returns>返回Connection对象</returns>private IDbConnection GetConnection(){IDbConnection connection = _factory.CreateConnection();connection.ConnectionString = _connString;connection.Open();return connection;}/// <summary>/// 获取Command对象/// </summary>/// <param name="sqlString">传送完整的sql语句</param>/// <param name="param">Paramter参数值,可以是匿名对象或实体对象</param>/// <param name="commandType">执行的是sql语句还是,存储过程</param>/// <param name="commandTimeout">链接数据的时间限制</param>/// <returns>Command对象</returns>private IDbCommand GetCommand(string sqlString, dynamic param = null, CommandType commandType = CommandType.Text,int? commandTimeout = 60){IDbCommand command = _factory.CreateCommand();command.Connection = GetConnection();command.CommandText = sqlString;command.CommandType = commandType;command.CommandTimeout = commandTimeout.Value;//添加参数SetParameters(command, param);return command;}/// <summary>/// 将对象转为paramter传给command对象/// </summary>/// <param name="comm">Command对象</param>/// <param name="obj"></param>private void SetParameters(IDbCommand comm, dynamic obj){if (comm == null || obj == null) return;Type type = obj.GetType();//typeof(t);comm.Parameters.Clear();//IEnumerable iEnumer = obj as IEnumerable;//if (iEnumer != null && !(iEnumer is string)) {//}PropertyInfo[] propertyInfos = type.GetProperties();foreach (PropertyInfo item in propertyInfos){switch (_ddlType){case DbOperation.Insert:if (IdentityAttribute.GetAttribute(item) != null) continue;break;case DbOperation.Delete:break;}DbParameter dbparameter = _factory.CreateParameter();dbparameter.ParameterName = "@" + item.Name;//if (item.GetValue(obj) != null)//{// dbparameter.Value = "";//}dbparameter.Value = item.GetValue(obj);comm.Parameters.Add(dbparameter);}}/// <summary>/// 执行增删改语句命名/// </summary>/// <param name="comm">Command对象</param>/// <param name="obj"></param>private dynamic Execute(IDbCommand comm){return comm.ExecuteNonQuery();}/// <summary>/// 返回首行首列数据/// </summary>/// <param name="comm">Command对象</param>/// <param name="obj"></param>private dynamic ExecuteScalar(IDbCommand comm){object obj = comm.ExecuteScalar();dynamic dy = obj;if (obj.GetType() == typeof(int)) dy = (int)obj;if (obj.GetType() == typeof(long)) dy = (long)obj;if (obj.GetType() == typeof(decimal)) dy = (decimal)obj;if (obj.GetType() == typeof(bool)) dy = (bool)obj;if (obj.GetType() == typeof(string)) dy = obj.ToString();return dy;}/// <summary>/// 执行command命令/// </summary>/// <param name="etFunc">调用方法名</param>/// <param name="sqlString">传送完整的sql语句</param>/// <param name="param">Paramter参数值,可以是匿名对象或实体对象</param>/// <param name="commandType">执行的是sql语句还是,存储过程</param>/// <param name="commandTimeout">链接数据的时间限制</param>/// <returns></returns>private dynamic ExTranc(ExecuteTranc etFunc, string sqlString, dynamic param = null,bool IsOpenTran= true, CommandType commandType = CommandType.Text, int? commandTimeout = 60){using (IDbCommand comm = GetCommand(sqlString, param, commandType, commandTimeout)){using (comm.Connection){dynamic result;IDbTransaction tran = null;if (IsOpenTran) {tran = comm.Connection.BeginTransaction();}try{comm.Transaction = tran;result = etFunc(comm);if(tran != null ) tran.Commit();return result;}catch (Exception ex){try{if (tran != null) tran.Rollback();}catch (Exception){string exce = "发生错误,SQL语句为:" + sqlString + (param != null ? "实体为:" + param.ToString() : "");throw new Exception(exce, ex);}}return 0;}}}#endregion#region 数据操作与查询#region 单行单列/// <summary>/// 传送sql语句,执行增删改操作/// </summary>/// <param name="sql">完整sql语句</param>/// <returns>受影响行数</returns>public int ExecuteSql(string sql){return ExTranc(Execute, sql);}/// <summary>/// 返回首行首列数据/// </summary>/// <param name="sql">完整sql语句</param>/// <returns>受影响行数</returns>public int ExecuteScalarSql(string sql){return ExTranc(ExecuteScalar, sql);}#endregion#region 删除/// <summary>/// 删除实体对象/// </summary>/// <typeparam name="T">实体对象</typeparam>/// <param name="where">删除sql条件</param>/// <returns>受影响行数</returns>public int DelectEntity<T>(string where){return ExTranc(Execute, sqlstr.DeleteToSql<T>(where));}/// <summary>/// 删除全部数据,自增列重新排序/// </summary>/// <typeparam name="T">实体对象</typeparam>/// <returns>受影响行数</returns>public int TruncateTable<T>(){return ExTranc(Execute, sqlstr.TruncateToSql<T>());}#endregion#region 添加/// <summary>/// 添加单个对象/// </summary>/// <param name="entity">实体对象</param>/// <returns>受影响行数</returns>public int AddEntity<T>(object entity){return ExTranc(Execute, sqlstr.AddToSql<T>(entity, _dbType), entity);}/// <summary>/// 添加单个对象/// </summary>/// <param name="tableName">表名</param>/// <param name="entity">实体对象</param>/// <returns>受影响行数</returns>public int AddEntity(string tableName, object entity){return ExTranc(Execute, sqlstr.AddToSql(entity, _dbType), entity);}/// <summary>/// 添加单个对象/// </summary>/// <param name="entity">实体对象</param>/// <returns>受影响行数</returns>public int AddEntity(BaseEntity entity){return ExTranc(Execute, sqlstr.AddToSql(entity, _dbType), entity);//Execute(sqlstr.AddToSql(entity, _dbType), entity);}/// <summary>/// 添加一组对象/// </summary>/// <param name="entities">添加集合</param>/// <returns>受影响行数</returns>public int AddEntities(ICollection entities){//List<KeyValuePair<dynamic,string>> dic = new List<KeyValuePair<dynamic,string>>();string insertSql = sqlstr.AddsToSql(entities, _dbType, true);//foreach(KeyValuePair<dynamic,string> k in dic){// Execute(k.Value, k.Key,CommandType.Text);// count++;//}return ExTranc(Execute, insertSql);}#endregion#region 跟新/// <summary>/// 更新单个对象/// </summary>/// <param name="entity"></param>/// <param name="primaryKeyField"></param>/// <returns></returns>public int UpdateEntity(object entity){return ExTranc(Execute, sqlstr.UpdateToSql(entity), entity);}/// <summary>/// 更新一组对象/// </summary>/// <param name="entity"></param>/// <param name="primaryKeyField"></param>/// <returns></returns>public int UpdatesEntity(List<KeyValuePair<dynamic, string>> enumerable){return ExTranc(Execute, sqlstr.UpdatesToSql(enumerable, true));}#endregion#region 查询/// <summary>/// 获取对象的集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>public List<T> GetListEntity<T>(string sqlString, dynamic param = null, CommandType commandType = CommandType.Text){List<T> result = new List<T>();using (DbCommand comm = GetCommand(sqlstr.Recombine(sqlString), param, commandType)){using (comm.Connection){using (IDataReader reader = comm.ExecuteReader()){while (reader.Read()){result.Add(GetEntity<T>(reader));}}}}return result;}/// <summary>/// 获取单个对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>public T GetEntity<T>(string sql, object entity = null){List<T> list = GetListEntity<T>(sql, entity);T result = default(T);if (list != null && list.Count > 0){result = list.FirstOrDefault<T>();}return result;}public T GetEntityByID<T>(long id){string sql = sqlstr.SqlectByIdToSql<T>(id);List<T> list = GetListEntity<T>(sql, null, CommandType.Text);T result = default(T);if (list != null && list.Count > 0){result = list.FirstOrDefault<T>();}return result;}private T GetEntity<T>(IDataReader dr){T t = Activator.CreateInstance<T>();string name = "";for (int i = 0; i < dr.FieldCount; i++){if (!dr[i].Equals(DBNull.Value)){name = dr.GetName(i).Substring(0, 1).ToUpper() + dr.GetName(i).Substring(1);if (typeof(T).GetProperty(name) != null)typeof(T).GetProperty(name).SetValue(t, dr[i], null);}}return t;}public List<T> GetListEntity<T>(PageHelp page, string strWhere = "1=1", string orderBy = "", object entity = null){string str = sqlstr.SelectJoinSql<T>(page, strWhere, orderBy, _dbType);return GetListEntity<T>(str, entity, CommandType.Text);}public List<T> GetListEntity<T>(string strWhere = "1=1", object entity = null){string str = sqlstr.SelectToSql(typeof(T), strWhere, _dbType);return GetListEntity<T>(str, entity, CommandType.Text);}public long GetEntityCount<T>(string strWhere = "1=1", string orderBy = "", object entity = null){string sql = sqlstr.SelectJoinSql<T>(new PageHelp(), strWhere, orderBy, _dbType);return ExTranc(ExecuteScalar, sql);}#endregion#endregion}public class BaseEntity{}
转载于:https://www.cnblogs.com/luanyizixuan/articles/5250893.html
利用特性、泛型、反射生成sql操作语句(待修改相关推荐
- excel数据生成sql insert语句
excel数据生成sql insert语句 excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用ex ...
- php 自动生成sql,用PHP批量生成SQL更新语句 网页版
有时候我们遇到很的SQL需要更新的时候,主意是大批量的时候 如果手动去添加单引号 双引号啥的 效率是非常的慢的! 下面看看批量成成的结果图: 如果是需要手动输入的是不是很慢呢! 代码逻辑思路很简单, ...
- MySQL 批量生成 SQL 脚本语句解决实际的业务需求/如何拼接字符串/拼接字符串的 SQL 语句
文章目录 实际需求 分析思路 写拼接 SQL 脚本的脚本语句 执行得到脚本语句 保存成 SQL 脚本文件 实际需求 有些行政区域的字段 area_fullname 是空的,如何补全呢?如下所示: 分析 ...
- ubuntu下mysql语句_Ubuntu安装mysql及常用SQL操作语句
Ubuntu安装mysql及常用SQL操作语句:安装mysql,在终端运行如下三条命令. sudo apt-get install mysql-server sudo apt-get install ...
- 数据库操作 linq php,.NET_asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析,本文实例讲述了asp.net使用LINQ t - phpStudy...
asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析 本文实例讲述了asp.net使用LINQ to SQL连接数据库及SQL操作语句用法.分享给大家供大家参考,具体如下: LI ...
- pdm生成mysql sql语句_PDM文件生成sql执行语句
一.pdm生成sql: 1.Database --->Database Generation或者 CTRL+G快捷键 打开生成对话框,做下面的相关设置后,点击ok即可生成sql脚本. 一.pdm ...
- 将PDM文件生成sql执行语句
一.pdm生成sql: 1.Database --->Database Generation或者 CTRL+G快捷键 打开生成对话框,做下面的相关设置后,点击ok即可生成sql脚本. 一.pdm ...
- sql替换语句 批量修改、增加、删除字段内容
sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 替换字段=REPLACE(替换字段,原来内容,新内容) 举例说明: ...
- java泛型怎么用反射生成_Java 之 使用反射生成并操作对象
一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...
- SQL操作语句之查询及删除重复记录的方法
delete from 表 where id not in(select min(id) from 表 group by name ) //删除重复名字的记录 删除之前请用语句 select * fr ...
最新文章
- 《经济学人》万字长文:DeepMind和谷歌的AI拉锯战
- SpringMVC_实现简单的增删改查
- python 回归去掉共线性_一文讲解机器学习算法中的共线性问题
- 【转】投影矩阵的推导
- JavaScript公共运行库
- linux终端登录软件,小白入门之四:使用终端登录软件,登录linux系统
- 【译】LiveData 在 SnackBar/Navigation 情景下的使用(SingleLiveEvent)
- OpenSolaris北京用户组的第一次活动
- Whiteboard for mac(mac画图软件)
- RxView学习及实现按钮防抖功能
- Lae程序员小漫画(二),仅供一乐
- Reasoning about Entailment with Neural Attention
- 25. Green Living 绿色生活
- 系数( coefficients)、因数或因子( factors)
- 老板用个人手机可以远程监控员工的电脑吗?
- Android,使用MMKV存储Bean实体对象
- SiTime 硅晶振与石英晶振的区别
- 推荐一个开源U盘启动工具——Ventoy
- 《Python爬虫大数据采集与挖掘》期末考试考题汇总带答案
- 2021年质量员-市政方向-通用基础(质量员)考试资料及质量员-市政方向-通用基础(质量员)模拟考试