/// <summary>
        /// 将取出的数据写入实体类
        /// </summary>
        /// <param name="model"></param>
        /// <param name="cmdText"></param>
        public void GetModel(object model, string cmdText)
        {
            PropertyInfo propertyInfo;
            DbDataReader dr = ExecuteDataReader(conn, cmdText);
            while (dr.Read())
            {
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    propertyInfo = model.GetType().GetProperty(dr.GetName(i));
                    if (propertyInfo != null)
                    {
                        if (dr.GetValue(i) != DBNull.Value)
                        {
                            propertyInfo.SetValue(model, dr.GetValue(i), null);
                        }
                    }
                }
            }
            dr.Close();
            conn.Close();
        }如上代码 当连接是SQL SERVER数据库时,没有问题,连接到ORACLE数据库时,dr里面也有数据了,但是propertyInfo却为null,难道反射代码不能操作oracle数据库?请教了...

解决方案 »

  1.   

    你碰到鬼了吧,反射是基础类库,跟数据库风马牛不相及//只要dr.GetValue(i)有值,并且model是引用类型,就可以
      propertyInfo.SetValue(model, dr.GetValue(i), null);
      

  2.   

    与数据库没关系,操作oracle数据库,是否获取到值。跟踪看看
    ExecuteDataReader方法是否支持
      

  3.   

    是的 是dr读出的字段名的问题,实体的属性区分大小写,比如select UserName,UserAge from users
    propertyInfo = model.GetType().GetProperty(dr.GetName(i));
    dr.GetName(i)就是UserName,UserAge 与实体属性对应是一致的,但是把连接串改成ORACLE,调试时发现
    dr.GetName(i)成了 USERNAME,USERAGE 觉得很奇怪,就与实体属性不对应了 所以 oracle里SQL语句对于字符区分大些小,SQLSERVER里的SQL 语句不区分