今天有人問我Update語句怎么搞,想了一下大致思路就是用特性去標識一下,主鍵,然后再去用反射的方式拼sql語句。
想着晚上再寫,又想了想的確好久沒寫博客了,也好久沒正兒八經寫代碼了,就順手給寫了下來。
一、主鍵特性
/// <summary> /// 主鍵特性(在實體類的上方加這個特性,指定該類的主鍵名稱) /// </summary> [AttributeUsage(AttributeTargets.Class)] public class PrimaryKeyAttribute : Attribute { private PrimaryKeyAttribute() { } private string _name; /// <summary> /// 構造方法 /// </summary> /// <param name="name"></param> public PrimaryKeyAttribute(string name) { _name = name; } /// <summary> /// 主鍵名稱 /// </summary> public string Name { get { return _name; } } }
把這個特性加到實體類的上方,並指定主鍵名稱,就可以了,示例:
二、拼寫SQL語句
public class SqlBuilderHelper { /// <summary> /// 獲得主鍵名稱 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static string GetPK<T>() where T : class { string pkName = string.Empty; Type objTye = typeof(T); PrimaryKeyAttribute pk; foreach (Attribute attr in objTye.GetCustomAttributes(true)) { pk = attr as PrimaryKeyAttribute; if (pk != null) return pk.Name; } return pkName; } /// <summary> /// sql修改語句 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity"></param> /// <param name="tableName"></param> /// <returns></returns> public static string UpdateSql<T>(T entity, string tableName) where T : class { if (entity == null || string.IsNullOrEmpty(tableName)) { return string.Empty; } string pkName = GetPK<T>(); if (string.IsNullOrEmpty(pkName)) { return string.Empty; } string pkValue = string.Empty; StringBuilder sb = new StringBuilder(); sb.Append("update "); sb.Append(tableName); sb.Append(" set "); Type type = entity.GetType(); PropertyInfo[] props = type.GetProperties(); List<string> paraList = new List<string>(); foreach (var prop in props) { if (prop.Name == (string)pkName) { pkValue = (string)prop.GetValue(entity); } else { paraList.Add(GetUpdatePara(prop, entity)); } } if (paraList.Count == 0) { return string.Empty; } sb.Append(string.Join(",", paraList)); if (string.IsNullOrEmpty(pkValue)) { throw new Exception("主鍵不能為空"); } sb.Append(" where "); sb.Append(pkName); sb.Append(" = "); sb.AppendFormat("'{0}'", pkValue); return sb.ToString(); } /// <summary> /// 獲得修改參數 /// </summary> /// <param name="property"></param> /// <returns></returns> private static string GetUpdatePara<T>(PropertyInfo property, T entity) { StringBuilder sb = new StringBuilder(); sb.AppendFormat(" {0}='{1}' ", property.Name, property.GetValue(entity)); return sb.ToString(); } }
用這個方法生成了一個語句,拿到庫里面試了一下,完全ok。
大功告成。