zoukankan      html  css  js  c++  java
  • winform中利用反射实现泛型数据访问对象基类(2)

    在1的基础上做了一点改进 参数化处理 看上去更简洁 无主键情况下 update 方法需要改进 insert delete没有问题

     /// <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 int 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.ToInt32(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
                    {
                        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="field">实体属性名称</param>
            /// <returns></returns>
            public bool UpdateT(T entity, string field)
            {
                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>();
                updateValues.Append(field + "=@" + field + " ");
                paras.Add(new SqlParameter("@" + field, t.GetProperty(field).GetValue(entity, null)));
                sql.Append(updateValues.ToString());
                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 == typeof(string))
                            {
                                t.GetProperty(property.Name).SetValue(entity, Convert.ToString(dt.Rows[0][property.Name]), null);
                            }
                            else if (property.PropertyType == typeof(int?))
                            {
                                t.GetProperty(property.Name).SetValue(entity, Convert.ToInt32(dt.Rows[0][property.Name]), null);
                            }
                            else if (property.PropertyType == typeof(DateTime?))
                            {
                                t.GetProperty(property.Name).SetValue(entity, Convert.ToDateTime(dt.Rows[0][property.Name]), null);
                            }
                            else if (property.PropertyType == typeof(long?))
                            {
                                t.GetProperty(property.Name).SetValue(entity, Convert.ToInt64(dt.Rows[0][property.Name]), null);
                            }
                            else if (property.PropertyType == typeof(double?))
                            {
                                t.GetProperty(property.Name).SetValue(entity, Convert.ToDouble(dt.Rows[0][property.Name]), null);
                            }
                            else if (property.PropertyType == typeof(bool?))
                            {
                                t.GetProperty(property.Name).SetValue(entity, Convert.ToBoolean(dt.Rows[0][property.Name]), null);
                            }
                            else if (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);
                }
            }

        }
  • 相关阅读:
    洛谷.3254.圆桌问题(最大流ISAP)
    BZOJ.2639.矩形计算(二维莫队)
    BZOJ.2724.[Violet 6]蒲公英(静态分块)
    BZOJ.4241.历史研究(回滚莫队 分块)
    BZOJ.4542.[HNOI2016]大数(莫队)
    SPOJ.COT2 Count on a tree II(树上莫队)
    BZOJ.3757.苹果树(树上莫队)
    洛谷.2325.[SCOI2005]王室联邦(贪心)
    BZOJ.1299.[LLH邀请赛]巧克力棒(博弈论 Nim)
    HDU.2516.取石子游戏(博弈论 Fibonacci Nim)
  • 原文地址:https://www.cnblogs.com/njcxwz/p/4630058.html
Copyright © 2011-2022 走看看