connText = "select * from " + tableName + " where " + f;
                SqlDataReader datar = SQLServer.SQLServer.getList(connText, parms);                IList<T> listT = new List<T>();
                
                while (datar.Read())
                {
                    T tmodel = new T();
                    int k=0;
                    foreach (PropertyInfo pro in pros)
                    {
                        pro.SetValue(listT, datar.GetSqlValue(k), null);
                        k++;
                    }
                    listT.Add(tmodel);
                }我在运行时下面出现错误,想问一下 在我不确定数据库某列值的类型的时候,该怎么在SqlDataReader中获取值呢对象与目标类型不匹配。 异常详细信息: System.Reflection.TargetException: 对象与目标类型不匹配。源错误: 
行 141:                    foreach (PropertyInfo pro in pros)
行 142:                    {
行 143:                        pro.SetValue(listT, datar.GetSqlValue(k), null);行 144:                        k++;
行 145:                    }
 

解决方案 »

  1.   

    pro.SetValue(listT, datar.GetSqlValue(k), null);
    listt这个不对吧,应该是listT的某一行和列吧?
      

  2.   

    代码写错了  但是改正还是错误 connText = "select * from " + tableName + " where " + f;
                    SqlDataReader datar = SQLServer.SQLServer.getList(connText, parms);                IList<T> listT = new List<T>();
                    
                    while (datar.Read())
                    {
                        T tmodel = new T();
                        int k=0;
                        foreach (PropertyInfo pro in pros)
                        {
                            pro.SetValue(tmodel, datar.GetSqlValue(k), null);
                            k++;
                        }
                        listT.Add(tmodel);
                    }
                    return listT;
    错误代码:
    类型“System.Data.SqlTypes.SqlInt32”的对象无法转换为类型“System.Nullable`1[System.Int32]”。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentException: 类型“System.Data.SqlTypes.SqlInt32”的对象无法转换为类型“System.Nullable`1[System.Int32]”。源错误: 
    行 141:                    foreach (PropertyInfo pro in pros)
    行 142:                    {
    行 143:                        pro.SetValue(tmodel, datar.GetSqlValue(k), null);行 144:                      
      k++;
    行 145:                    }
     
      

  3.   

    反射进行赋值不实用的。要求model 和字段的顺序一致。不然就报告楼主的哪种错误。幸亏报告类型错误,如果是同类型的话赋值错位你都不知道。
      

  4.   


    public static IList<T> ToList<T>(SqlDataReader dr) where T:new()
    {
    List<T> list = new List<T>();
    var properties = TypeDescriptor.GetProperties(typeof(T));
    var fields = Enumerable.Range(0, dr.FieldCount-1).Select(i=> dr.GetName(i)).Where(name => properties[name] != null); while (dr.Read())
    {
    T o = new T();
    fields.ToList().ForEach(field => { properties[field].SetValue(o, dr[field] == DBNull.Value ? null : dr[field]); });
    list.Add(o);
    }
    return list;
    }