• 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);
                }
            }
    
    
        }
  • 相关阅读:
    警示
    【拒绝挂分】盘点蒟蒻ghy的各种sb错误
    牛客NOIPtg day5 B-demo的gcd
    数字校园APP——视频分享
    数字校园APP——软件需求规格说明书
    数字校园APP——可行性报告分析
    数字校园APP开发与应用
    结对编程第二次作业——四则运算自动生成器
    软件工程第四次作业
    软件工程第三次作业
  • 原文地址:https://www.cnblogs.com/njcxwz/p/4765481.html
Copyright © 2020-2023  润新知