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操作语句(待修改相关推荐

  1. excel数据生成sql insert语句

    excel数据生成sql insert语句 excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用ex ...

  2. php 自动生成sql,用PHP批量生成SQL更新语句 网页版

    有时候我们遇到很的SQL需要更新的时候,主意是大批量的时候 如果手动去添加单引号 双引号啥的 效率是非常的慢的! 下面看看批量成成的结果图: 如果是需要手动输入的是不是很慢呢! 代码逻辑思路很简单, ...

  3. MySQL 批量生成 SQL 脚本语句解决实际的业务需求/如何拼接字符串/拼接字符串的 SQL 语句

    文章目录 实际需求 分析思路 写拼接 SQL 脚本的脚本语句 执行得到脚本语句 保存成 SQL 脚本文件 实际需求 有些行政区域的字段 area_fullname 是空的,如何补全呢?如下所示: 分析 ...

  4. ubuntu下mysql语句_Ubuntu安装mysql及常用SQL操作语句

    Ubuntu安装mysql及常用SQL操作语句:安装mysql,在终端运行如下三条命令. sudo apt-get install mysql-server sudo apt-get install ...

  5. 数据库操作 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 ...

  6. pdm生成mysql sql语句_PDM文件生成sql执行语句

    一.pdm生成sql: 1.Database --->Database Generation或者 CTRL+G快捷键 打开生成对话框,做下面的相关设置后,点击ok即可生成sql脚本. 一.pdm ...

  7. 将PDM文件生成sql执行语句

    一.pdm生成sql: 1.Database --->Database Generation或者 CTRL+G快捷键 打开生成对话框,做下面的相关设置后,点击ok即可生成sql脚本. 一.pdm ...

  8. sql替换语句 批量修改、增加、删除字段内容

    sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 替换字段=REPLACE(替换字段,原来内容,新内容) 举例说明: ...

  9. java泛型怎么用反射生成_Java 之 使用反射生成并操作对象

    一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...

  10. SQL操作语句之查询及删除重复记录的方法

    delete from 表 where id not in(select min(id) from 表 group by name ) //删除重复名字的记录 删除之前请用语句 select * fr ...

最新文章

  1. 《经济学人》万字长文:DeepMind和谷歌的AI拉锯战
  2. SpringMVC_实现简单的增删改查
  3. python 回归去掉共线性_一文讲解机器学习算法中的共线性问题
  4. 【转】投影矩阵的推导
  5. JavaScript公共运行库
  6. linux终端登录软件,小白入门之四:使用终端登录软件,登录linux系统
  7. 【译】LiveData 在 SnackBar/Navigation 情景下的使用(SingleLiveEvent)
  8. OpenSolaris北京用户组的第一次活动
  9. Whiteboard for mac(mac画图软件)
  10. RxView学习及实现按钮防抖功能
  11. Lae程序员小漫画(二),仅供一乐
  12. Reasoning about Entailment with Neural Attention
  13. 25. Green Living 绿色生活
  14. 系数( coefficients)、因数或因子( factors)
  15. 老板用个人手机可以远程监控员工的电脑吗?
  16. Android,使用MMKV存储Bean实体对象
  17. SiTime 硅晶振与石英晶振的区别
  18. 推荐一个开源U盘启动工具——Ventoy
  19. 《Python爬虫大数据采集与挖掘》期末考试考题汇总带答案
  20. 2021年质量员-市政方向-通用基础(质量员)考试资料及质量员-市政方向-通用基础(质量员)模拟考试

热门文章

  1. JAVA自学-day16-List的子类、泛型、增强for循环、静态导入、可变参数
  2. MapReduce:Combiner与Shuffle阶段之Reducer输入
  3. ThinkBook 14 G2 ITL 重装系统 笔记
  4. Java 开发flink流/批处理程序
  5. 程序员的奋斗史(七)——沟通交流、表达能力的重要性
  6. Python 破解 MD5 暗号
  7. Weak Pointer
  8. 给PDF文档添加图片签名的简单方法
  9. 服务器带宽上行与下行是什么意思,有什么区别
  10. IDEA中pom文件变成了橘色