继续完善了几点代码 满足没有主键的情况下使用 并且完善实体字段反射设置value时的类型转换
/// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDao<T> where T : new() { protected DataModule dataModule = new DataModule(); /// <summary> /// 表名 /// </summary> public virtual string TableName { get; set; } /// <summary> /// 主键ID /// </summary> public virtual string PrimaryKey { get; set; } /// <summary> /// 实体属性 /// </summary> private PropertyInfo[] properties = null; /// <summary> /// 实体类型 /// </summary> private readonly Type t = typeof(T); public BaseDao() { t = typeof(T); properties = t.GetProperties(); } public BaseDao(string tableName, string primaryKey) : this() { this.TableName = tableName; this.PrimaryKey = primaryKey; } public long GetMaxID() { string sql = "select max(cast(" + PrimaryKey + " as decimal(18,0))) as MaxId from " + TableName; DataTable dt = dataModule.GetDataTable(sql); if (dt.Rows[0][0] == DBNull.Value) { return 1; } else { return Convert.ToInt64(dt.Rows[0][0]) + 1; } } /// <summary> /// 清除实体字段 /// </summary> /// <param name="entity"></param> public void ClearT(ref T entity) { entity = default(T); entity = new T(); } /// <summary> /// 获取实体 /// </summary> /// <param name="id"></param> /// <returns></returns> public T GetT(string id) { string sql = "select * from " + TableName + " where " + PrimaryKey + "='" + id + "'"; DataTable dt = dataModule.GetDataTable(sql); T entity = new T(); return SetEntityValue(dt, entity); } /// <summary> /// 根据多个条件获取实体 /// </summary> /// <param name="entity"></param> /// <returns></returns> public T GetT(T entity) { StringBuilder sql = new StringBuilder("select * from " + TableName + " where "); Hashtable ht = GetWhereConditionSQL(entity); string where = ht["SQL"] as string; sql.Append(where); SqlParameter[] paras = ht["PAMS"] as SqlParameter[]; DataTable dt = dataModule.GetDataTable(sql.ToString(), paras); return SetEntityValue(dt, entity); } /// <summary> /// 保存 /// </summary> /// <param name="e"></param> /// <returns></returns> public bool InsertT(T entity) { StringBuilder sql = new StringBuilder(""); if (string.IsNullOrEmpty(TableName)) { TableName = t.FullName.TrimStart((t.Namespace + ".").ToArray()); } if (!string.IsNullOrEmpty(PrimaryKey) && t.GetProperty(PrimaryKey).GetValue(entity, null) == null) { if (t.GetProperty(PrimaryKey).PropertyType == typeof(string)) { t.GetProperty(PrimaryKey).SetValue(entity, GetMaxID().ToString(), null); } else if (t.GetProperty(PrimaryKey).PropertyType == typeof(int?) || t.GetProperty(PrimaryKey).PropertyType == typeof(int)) { t.GetProperty(PrimaryKey).SetValue(entity, Convert.ToInt32(GetMaxID()), null); } else { t.GetProperty(PrimaryKey).SetValue(entity, GetMaxID(), null); } } sql.Append(" Insert into " + TableName + " ( "); StringBuilder insertFields = new StringBuilder(""); StringBuilder insertValues = new StringBuilder(""); List<SqlParameter> paras = new List<SqlParameter>(); foreach (PropertyInfo property in properties) { if (property.GetValue(entity, null) != null) { insertFields.Append("" + property.Name + ","); insertValues.Append("@" + property.Name + ","); paras.Add(new SqlParameter("@" + property.Name, property.GetValue(entity, null))); } } sql.Append(insertFields.ToString().TrimEnd(',')); sql.Append(" ) VALUES ( "); sql.Append(insertValues.ToString().TrimEnd(',')); sql.Append(")"); return dataModule.ExcuteSql(sql.ToString(), paras.ToArray()); } /// <summary> /// 更新 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool UpdateT(T entity) { StringBuilder sql = new StringBuilder(""); if (string.IsNullOrEmpty(TableName)) { TableName = t.FullName.TrimStart((t.Namespace + ".").ToArray()); } sql.Append(" update " + TableName + " set "); StringBuilder updateValues = new StringBuilder(""); List<SqlParameter> paras = new List<SqlParameter>(); foreach (PropertyInfo property in properties) { if (property.GetValue(entity, null) != null) { updateValues.Append(property.Name + "=@" + property.Name + ","); paras.Add(new SqlParameter("@" + property.Name, property.GetValue(entity, null))); } else { updateValues.Append(property.Name + "=null,"); } } sql.Append(updateValues.ToString().TrimEnd(',')); sql.Append(" where " + PrimaryKey + "=@" + PrimaryKey); return dataModule.ExcuteSql(sql.ToString(), paras.ToArray()); } /// <summary> /// 根据指定的条件字段更新实体 /// </summary> /// <param name="entity"></param> /// <param name="conditions">指定的条件字段</param> /// <returns></returns> public bool UpdateT(T entity, params string[] conditions) { StringBuilder sql = new StringBuilder(""); if (string.IsNullOrEmpty(TableName)) { TableName = t.FullName.TrimStart((t.Namespace + ".").ToArray()); } sql.Append(" update " + TableName + " set "); StringBuilder updateValues = new StringBuilder(""); List<SqlParameter> paras = new List<SqlParameter>(); foreach (PropertyInfo property in properties) { if (property.GetValue(entity, null) != null) { updateValues.Append(property.Name + "=@" + property.Name + ","); paras.Add(new SqlParameter("@" + property.Name, property.GetValue(entity, null))); } else { updateValues.Append(property.Name + "=null,"); } } sql.Append(updateValues.ToString().TrimEnd(',')); sql.Append(" where "); StringBuilder whereValues = new StringBuilder(""); foreach (string condition in conditions) { whereValues.Append(condition + "=@" + condition + " and"); } sql.Append(whereValues.ToString().TrimEnd("and".ToArray())); return dataModule.ExcuteSql(sql.ToString(), paras.ToArray()); } /// <summary> /// 更新指定字段 /// </summary> /// <param name="entity"></param> /// <param name="fields">需要更新的字段</param> /// <returns></returns> public bool UpdateFields(T entity, params string[] fields) { StringBuilder sql = new StringBuilder(""); if (string.IsNullOrEmpty(TableName)) { TableName = t.FullName.TrimStart((t.Namespace + ".").ToArray()); } sql.Append(" update " + TableName + " set "); StringBuilder updateValues = new StringBuilder(""); List<SqlParameter> paras = new List<SqlParameter>(); foreach (string field in fields) { updateValues.Append(field + "=@" + field + ","); paras.Add(new SqlParameter("@" + field, t.GetProperty(field).GetValue(entity, null))); sql.Append(updateValues.ToString().TrimEnd(',')); } sql.Append(" where " + PrimaryKey + "=@" + PrimaryKey); paras.Add(new SqlParameter("@" + PrimaryKey, t.GetProperty(PrimaryKey).GetValue(entity, null))); return dataModule.ExcuteSql(sql.ToString(), paras.ToArray()); } /// <summary> /// 根据多个字段删除实体 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool DeleteT(T entity) { StringBuilder sql = new StringBuilder("delete from " + TableName + " where "); Hashtable ht = GetWhereConditionSQL(entity); string where = ht["SQL"] as string; sql.Append(where); SqlParameter[] paras = ht["PAMS"] as SqlParameter[]; return dataModule.ExcuteSql(sql.ToString(), paras); } /// <summary> /// 根据主键删除实体 /// </summary> /// <param name="id"></param> /// <returns></returns> public bool DeleteT(string id) { StringBuilder sql = new StringBuilder("delete from " + TableName + " where " + PrimaryKey + "='" + id + "'"); return dataModule.ExcuteSql(sql.ToString()); } /// <summary> /// 获取where 条件sql /// </summary> /// <param name="entity"></param> /// <returns></returns> private Hashtable GetWhereConditionSQL(T entity) { StringBuilder whereCondition = new StringBuilder(""); List<SqlParameter> paras = new List<SqlParameter>(); foreach (PropertyInfo property in properties) { if (property.GetValue(entity, null) != null) { whereCondition.Append(" " + property.Name + "=@" + property.Name + " and"); paras.Add(new SqlParameter("@" + property.Name, property.GetValue(entity, null))); if (property.Name == PrimaryKey) { break; } } } Hashtable ht = new Hashtable(); ht.Add("SQL", whereCondition.ToString().TrimEnd("and".ToArray())); ht.Add("PAMS", paras.ToArray()); return ht; } /// <summary> /// 设置实体属性值 /// </summary> /// <param name="dt"></param> /// <param name="entity"></param> /// <returns></returns> private T SetEntityValue(DataTable dt, T entity) { if (dt != null && dt.Rows.Count > 0) { foreach (PropertyInfo property in properties) { if (dt.Rows[0][property.Name] != DBNull.Value) { if (!property.PropertyType.IsGenericType) { t.GetProperty(property.Name).SetValue(entity, Convert.ChangeType(dt.Rows[0][property.Name], property.PropertyType), null); } else { Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(Nullable<>)) { t.GetProperty(property.Name).SetValue(entity, Convert.ChangeType(dt.Rows[0][property.Name], Nullable.GetUnderlyingType(property.PropertyType)), null); } } //if (property.PropertyType == typeof(string)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToString(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(int?) || property.PropertyType == typeof(int)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToInt32(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(DateTime?) || property.PropertyType == typeof(DateTime)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToDateTime(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(long?) || property.PropertyType == typeof(long)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToInt64(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(double?) || property.PropertyType == typeof(double)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToDouble(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(bool?) || property.PropertyType == typeof(bool)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToBoolean(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(decimal?) || property.PropertyType == typeof(decimal)) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToDecimal(dt.Rows[0][property.Name]), null); //} //else if (property.PropertyType == typeof(byte[])) //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToByte(dt.Rows[0][property.Name]), null); //} //else //{ // t.GetProperty(property.Name).SetValue(entity, Convert.ToString(dt.Rows[0][property.Name]), null); //} } } return entity; } else { return default(T); } } }