大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > 让ADO.NET Entity Framework 支持AC

让ADO.NET Entity Framework 支持AC(3)

关键词:数据库.NETADOEntity  阅读(1894) 赞(16)

[摘要]本文是对让ADO.NET Entity Framework 支持ACCESS数据库的讲解,与大家分享。
实现我们自己的where 这里如果我们自己生成类 那么我们的实体类类可以直接有一个where 方法,但是我为了能让我们懒人使用VS生成的实体类只能这么实现了。为了代码利用率,我们还需要另外2个函数。

取得所有记录

IEnumerable<TEntity> SelectAll<TEntity>() where TEntity : new()
        {
            TEntity TDefault = new TEntity();
            string entitySetName = TDefault.GetType().Name;
            string strSqlQuery = string.Format("SELECT * FROM {0}", entitySetName);
            m_LastSqlCommand = strSqlQuery;
            return SelectWhere<TEntity>(strSqlQuery);
        }

经常的条件查询

public IEnumerable<TEntity> Where<TEntity>(Expression<Func<TEntity, bool>> Func) where TEntity : new()
        {
            TEntity TDefault = new TEntity();
            string entitySetName = TDefault.GetType().Name;
            string strWhere = GetWhereString(Func).Replace("Where", entitySetName);
            string strSqlQuery = string.Format("SELECT * FROM {0} WHERE {1} ", entitySetName, strWhere);
            m_LastSqlCommand = strSqlQuery;
            return SelectWhere<TEntity>(strSqlQuery);
        }

最后的where

IEnumerable<TEntity> SelectWhere<TEntity>(string strSqlQuery) where TEntity : new()
        {
            TEntity TDefault = new TEntity();
            //确认基础类型是否是 EntityObject类型
            Type TBase = TDefault.GetType();
            while ((TBase.BaseType) != null)
            {
                if (TBase.Name == "EntityObject") break;
                TBase = TBase.BaseType;
            }
            bool IsPCEH = false;
            if (TBase != null && TBase.Name == "EntityObject")  IsPCEH = true;
            PropertyInfo[] properties = TDefault.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            List<TEntity> Records = new List<TEntity>();
            string entitySetName = TDefault.GetType().Name;
            try
            {
                OleDbCommand Cmd = new OleDbCommand(strSqlQuery, AccessConn);
                OleDbDataReader sqlReader = Cmd.ExecuteReader();
                #region 数据库查询开始
                while (sqlReader.Read())
                {
                    TEntity TValue = new TEntity();
                    //输入是EntityObject类型,那么加入属性改变事件
                    if (IsPCEH)
                    {
                        EntityObject EO = TValue as EntityObject;
                        EO.PropertyChanged += PropertyChangedEH;
                    }
                    for (int i = 0; i < sqlReader.FieldCount; i++)
                    {
                        string strField = sqlReader.GetName(i);
                        //根据字段名 反射 类的属性
                        PropertyInfo p = properties.Where(P => string.Compare(P.Name, strField, true) == 0).First();
                        #region 数据转换
                        switch (p.PropertyType.Name.ToString().ToLower())
                        {
                            case "int16":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetInt16(i), null);
                                break;
                            case "int32":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetInt32(i), null);
                                break;
                            case "int64":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetInt64(i), null);
                                break;
                            case "string":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetString(i), null);
                                break;
                            case "double":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetDouble(i), null);
                                break;
                            case "float":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetFloat(i), null);
                                break;
                            case "decimal":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetDecimal(i), null);
                                break;
                            case "datetime":
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetDateTime(i), null);
                                break;
                            default:
                                if (!sqlReader.IsDBNull(i)) p.SetValue(TValue, sqlReader.GetValue(i), null);
                                break;
                        }
                        #endregion

                    }
                    Records.Add(TValue);
                }
                #endregion
                Cmd.Clone();
                m_IsDetectionChange = true;
            }
            catch (Exception)
            {
                throw;
            }
            return Records;
        }

属性的改变(也就是数据库记录的字段值)我们要知道才能实现EF的SaveChanges()函数那么我们需要简历一个数组变量,直接上代码

//表名            //主键              //属性    值1 值2 主键类型名字
        Dictionary<string, Dictionary<string, Dictionary<string, object[]>>> m_ArrDetection = new Dictionary<string, Dictionary<string, Dictionary<string, object[]>>>();
void PropertyChangedEH(object sender, PropertyChangedEventArgs e)
        {
            //没有开启返回
            if (!m_IsDetectionChange) return;
            //反射所有属性
            PropertyInfo[] properties = sender.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            //查询主键
            PropertyInfo EntityKey = GetEntityKeyFormAllProperty(properties);
            //没有主键的返回(表必须要有主键)
            if (EntityKey == null) return;
            //表名字
            string Table = sender.GetType().Name;
            //主键值
            string MainKey = EntityKey.GetValue(sender, null).ToString();
            if (MainKey == null || MainKey == "") return;
            //没有表 就添加
            if (!m_ArrDetection.ContainsKey(Table)) m_ArrDetection[Table] = new Dictionary<string, Dictionary<string, object[]>>();
            //没有主键 就添加
            if (!m_ArrDetection[Table].ContainsKey(MainKey)) m_ArrDetection[Table][MainKey] = new Dictionary<string, object[]>();
            //主键是不用更新的(一般数据库主键都是自动增长的吧,尤其快速开发的项目)
            if (e.PropertyName == MainKey) return;
            PropertyInfo p = properties.Where(P => string.Compare(P.Name, e.PropertyName, true) == 0).First();
            //赋值
            m_ArrDetection[Table][MainKey][e.PropertyName] = new object[2] { p.GetValue(sender, null), EntityKey.Name };
        }

查找主键的函数



相关评论