winform中利用反射实现泛型数据访问对象基类(3)

继续完善了几点代码 满足没有主键的情况下使用 并且完善实体字段反射设置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);
            }
        }


    }
原文地址:https://www.cnblogs.com/njcxwz/p/4765481.html