如何将SqlDataReader 转换成IList 泛型

vip__888 2009-09-18 08:28:48
我正在做一个分页的绑定功能,通过aspnetpager分页控件绑定的
现在有一个问题 就是我传递一个实体类的泛型集合过去,在数据库中 读取的是SqlDataReader 怎么把它转换成为需要的IList<T>
而不是DataSet。
    public class PagerTestIList<T>
{
static SqlDataReader dr = null;
static int count;

/// <summary>
/// 带参构造 通过传递参数调用存储过程
/// </summary>
/// <param name="table">表名</param>
/// <param name="where">查询子句</param>
/// <param name="order">排序</param>
/// <param name="blCount">状态</param>
/// <param name="p">分页实体类</param>
public PagerTestIList(string table, string where, string order, bool blCount, KFS_Model.Pager p)
{
SqlParameter[] parm ={
new SqlParameter("@table",SqlDbType.NVarChar),
new SqlParameter("@where",SqlDbType.NVarChar),
new SqlParameter("@order",SqlDbType.NVarChar),
new SqlParameter("@docount",SqlDbType.Bit),
new SqlParameter("@startIndex",SqlDbType.Int),
new SqlParameter("@endIndex",SqlDbType.Int)
};
parm[0].Value = table;
parm[1].Value = where;
parm[2].Value = order;
parm[4].Value = p.StartPager;
parm[5].Value = p.EndPager;
if (blCount)
{
parm[3].Value = 1;
dr = SqlHelper.ExecuteReader(SqlHelper.connectionString, CommandType.StoredProcedure, "QAS_pagination", parm);
if (dr.Read())
{
count = Convert.ToInt32(dr["Row"].ToString());
}
}
else
{
parm[3].Value = 0;
dr = SqlHelper.ExecuteReader(SqlHelper.connectionString, CommandType.StoredProcedure, "QAS_pagination", parm);
}
}

/// <summary>
/// 返回查询总条数
/// </summary>
/// <returns>int</returns>
public static int GetRecordCount()
{
return count;
}


/// <summary>
/// 通过反射机制返回查询的结果
/// </summary>
/// <returns>IList<T></returns>
public static IList<T> GetIlist()
{
IList<T> list = new List<T>();
T t = null;
PropertyInfo[] p=t.GetType().GetProperties();
while (dr.Read())
{
//取得所有属性

foreach (PropertyInfo pi in p)
{
t+"."+pi.Name;
pi.PropertyType;

}
}
}

}


最后一个方法通过反射机制得到IList<T> 过不去了 请大虾们帮忙解决
...全文
1486 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sloder 2010-07-05
  • 打赏
  • 举报
回复
BindingFieldAttribute 是设么???
这些家伙乱引用,没弄清楚就别乱引用
vbmscommvs 2010-05-22
  • 打赏
  • 举报
回复
BindingFieldAttribute 是设么
vip__888 2009-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
public static IList <T> FillList <T>(System.Data.IDataReader reader)
        {
            IList <T> lst= new List <T>();
            while (reader.Read())
            {
                  T RowInstance = Activator.CreateInstance <T>();
                foreach (PropertyInfo Property in typeof(T).GetProperties())
                {
                    foreach (BindingFieldAttribute FieldAttr in    Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
                  {
                  try
                    {
  int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
                          if (reader.GetValue(Ordinal) != DBNull.Value)
                          {
                                Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
                            }
                        }
                        catch
                        {
                            break;
                        }
                    }
                }
                lst.Add(RowInstance);
            }
            return lst;
        }

[/Quote]

膜拜高手
wuyq11 2009-09-18
  • 打赏
  • 举报
回复
FillList <T>(System.Data.IDataReader reader) where T : class
wuyq11 2009-09-18
  • 打赏
  • 举报
回复
public static IList<T> FillList<T>(System.Data.IDataReader reader)
{
IList<T> lst= new List<T>();
while (reader.Read())
{
T RowInstance = Activator.CreateInstance<T>();
foreach (PropertyInfo Property in typeof(T).GetProperties())
{
foreach (BindingFieldAttribute FieldAttr in Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
{
try
{
int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
if (reader.GetValue(Ordinal) != DBNull.Value)
{
Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
}
}
catch
{
break;
}
}
}
lst.Add(RowInstance);
}
return lst;
}
tabbycat 2009-09-18
  • 打赏
  • 举报
回复
如果你的程序是网站就别用反射,反射损害性能的,JAVA的反射降低性能700倍,.NET也好不了多少
vip__888 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhxingway 的回复:]
C# codepublicstatic IList<SqlDataReader> GetIlist()
{
IList<SqlDataReader> list=new List<SqlDataReader>();
SqlDataReader t=null;
PropertyInfo[] p=t.GetType().GetProperties();while (dr.Read())
{//取得所有属性foreach (PropertyInfo piin p)
{
t+"."+pi.Name;
pi.PropertyType;

}
}
}

楼主应该把 <T>改成 <SqlDataReader >,,当然调用的时候也要显式说明返回的是IList <SqlDataReader > 才对,呵呵.

楼主的GetIlist()
这个方法没有返回值,不会编译错误吗
[/Quote]

我返回的是IList<T> 集合....
zhxingway 2009-09-18
  • 打赏
  • 举报
回复
public static IList<SqlDataReader > GetIlist()
{
IList<SqlDataReader > list = new List<SqlDataReader >();
SqlDataReader t = null;
PropertyInfo[] p=t.GetType().GetProperties();
while (dr.Read())
{
//取得所有属性

foreach (PropertyInfo pi in p)
{
t+"."+pi.Name;
pi.PropertyType;

}
}
}


楼主应该把<T>改成<SqlDataReader >,,当然调用的时候也要显式说明返回的是IList <SqlDataReader > 才对,呵呵.

楼主的GetIlist()
这个方法没有返回值,不会编译错误吗
不定项选择题(共14题,单选或多选): 一、一个HTML文档必须包含三个元素,它们是head、html和( )。 A.scriptB.bodyC.titleD.link 二、下面哪段javascript能弹出一个提示框?( ) A.document.alert(test) B.window.alert(test) C.document.alert('test ') D.window.alert('test ') 三、当鼠标放在一个链接上的css样式应该( )伪类来定义。 A.a:visitedB.a:linkC.a:hoverD.a:active 四、关于ASP.NET中的代码隐藏文件的描述正确的是( )。 A.Web窗体页的程序的逻辑由代码组,这些代码的创建用于与窗体交互。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名 B.web窗体也是类 C.项目中所有的Web窗体页的代码隐藏文件都被编译项目动态链接库(.dll)文件 D.以上都不正确 五、下列ASP.NET语句( )正确地创建了一个与SQL Server数据库的连接。 A.SqlConnection con1 = new Connection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); B.SqlConnection con1 = new SqlConnection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); C.SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); D.SqlConnection con1 = new SqlConnection(Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB); 六、执行一次无返回值的数据删除,必须用到下面哪些对象? ( ) A.SqlConnectionB.SqlDataAdapterC.SqlCommandD.SqlDataReader 七、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是( ) A.insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行; B.ExecuteNonQuery()方法返回执行Sql语句所影响的行数。 C.Select操作的Sql语句只能由ExecuteReader()方法来执行; D.ExecuteReader()方法返回一个DataReder对象; 八、ASP.NET有多种维护状态的技术,以下哪种是保存在客户端的?( ) A.VIEWSTATEB.SESSIONC.APPLICATIOND.数据CACHE 九、Cookies的默认生命周期有多长? ( ) A.20分钟B.30分钟C. 一天D.随浏览器的关闭而失效 十、int[][] myArray=new int[3][]{ new int[3]{ 5, 6, 2 }, new int[5]{ 6, 9, 7, 8, 3 }, new int[2]{ 3, 2 }}; myArray[2][2]的值是( ) A.9B.2C.6D.越界 十一、要为做了输出缓存的页面实现即时判断用户IP来路,可在以下哪种事件中实现? ( ) A.Page.InitB.HttpApplication.BeginRequest C.Page.LoadD.以上都不是 十二、下面哪个SQL语句完全正确( ) A.Select count(*) from (select top 10 * from table order by bb) tb group by cc B.update set bb = bb + 1 from table C.Select count(*) from (select distinct * from table) tb group by cc D.delete * from table 十三、为了实现a.aspx的URL重写,下面哪个正则表达式替换可以实现?( ) A. Regex.Replace(sUrl, @“/(\d+).aspx”, “a.aspx?ID=$0”, RegexOptions.IgnoreCase) B. Regex.Replace(sUrl, @“/(\d+).aspx”, “/a.aspx?ID=$0”, RegexOptions.IgnoreCase) C. Regex.Replace(sUrl, @“/(\d+).aspx”, “a.aspx?ID=$1”, RegexOptions.IgnoreCase) D. Regex.Replace(sUrl, @“/(\d+).aspx”, “/a.aspx?ID=$1”, RegexOptions.IgnoreCase) 十四、下面javascript代码的输出结果是( ) var aa = new Array(1, 2, 4, 5, 3, 6); var c = 0; for (var i = 0; i < aa.length; ++i){ c += aa.pop(); } document.write(c); 提示:Array.pop()函数将数组内最后一个元素移除并返回该元素 A.7 B.14 C.21 D.以上皆不正确 填空题(共4题): 一、C#中判断整变量k是否偶数的语句: 二、有这样的枚举定义:public enum TrainType{ 空调, 快速, 新, 卧铺 },为实现它的按位组合,你会分别赋予它们什么值?请用逗号按顺序分隔开 三、C#中为了防止非本程序集的代码访问,可以用什么关键字修饰类或者类员? 四、为了将table表内bb(datetime类)字段的数据按年月降序输出,对应的SQL语句为 选择题答案: 1.B,2.D,3.C,4.BC,5.B,6.AC,7.C,8.A,9.D,10.D,11.B,12.AC,13.D,14.B 填空题答案: 1.(k & 1) == 0 或 k % 2 == 0 2.1,2,4,8(答案不定,看情况) 3.internal 4.select * from table order by year(bb) desc, month(bb) desc 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定类声明中的任何类参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datatable,dataview , IList 4.概述反射和序列化 反射:程序集包含模块,而模块包含类,类又包含员。反射则提供了封装程序集、模块和类的对象。您可以使用反射动态地创建类的实例,将类绑定到现有对象,或从现有对象中获取类。然后,可以调用类的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。 5.概述o/r mapping 的原理 利用反射,配置 将类于数据库表映射 6.类员有( )种可访问形式 可访问形式?不懂。 可访问性:public ,protected ,private,internal 7.用sealed修饰的类有什么特点 sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数员的调用可以转换为非虚拟调用来处理。 8.列举ADO.NET中的五个主要对象,并简单描述 connection,command,dataReader,trans,dataset ... 9.执行下面代码后: String strTemp ="abcdefg 某某某"; Int i System.Text.Encoding.Default.GetBytes(strTemp).Length; Int j = strTemp.Length; 问:i=(14 ) ;j=(11 ) i=(14 ) ;j=(11 ) 中文两个字节 10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配) string str ="" 分配空间 11.详述.NET里class和struct的异同! class:放在 ? struct放在? struct值传递 类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的员类。然而,结构在几个重要方面不同于类:结构为值类而不是引用类,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。 12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。 远程逻辑调用,remoing接口只能用在.net中 13.什么是code-behind技术 aspx and cs 14.概述三层结构体系 web/business/dataaccess 15.asp.net如何实现MVC模式,举例说明! web/business/dataaccess ---------------------------------------------------------------------------------------------------------- 1.面向对象的思想主要包括什么? 答:这个题范围太广,不知道说什么. 2.什么是ASP.net中的用户控件 答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整. 3.什么叫应用程序域?什么是受管制的代码?什么是强类系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 答:装箱就是把值类引用类,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下你所了解的XML技术及其应用 答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它. 5.值类和引用类的区别?写出C#的样例代码。 答:结构是值类,类是引用类,所以传结构就是值类的应用啦,传对象或类就是引用类的,这个不用多写了吧. 6.ADO.net中常用的对象有哪些?分别描述一下。 答:connection command sqladapter dataset datatable dataview等等.写不完了. 7.如何理解委托? 答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法. msdn2005中是这样解释的: 委托具有以下特点: 委托类似于 C++ 函数指针,但它是类安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。 C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 8.C#中的接口和类有什么异同。 答:这个异同可多了,要说清楚还真不容易. 9.。net中读写数据库需要用到哪些类?他们的作用 答:这个类自已可以写的啊,你是指基类吗?那configuration,sqlconnection,sqlcommand等都要用到. 10.UDP连接和TCP连接的异同。 答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结. 11.ASP.net的身份验证方式有哪些?分别是什么原理? 答:form认证,windows集认证等,原理不清楚. 12.进程和线程分别怎么理解? 答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以为别人的儿子,一个老子也可以为别的老子生儿子. 13.什么是code-Behind技术。 答:代码分离,这是个明智的东西,像ASP这样混一堆很不爽.或者可以理解HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的. 14.活动目录的作用。 答:这个不明白.请明白的补充一下. 15..net中读写XML的类都归属于哪些命名空间? 答:System.Xml 我自已写的就不一定了,嘿嘿. 16.解释一下UDDI、WSDL的意义及其作用。 答:什么东西? 17.什么是SOAP,有哪些应用。 答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看:http://playist.blogchina.com/2521621.html 18.如何部署一个ASP.net页面。 答:随便啦,想直接上传就直接上传,想打包EXE就打包,看个人喜好. 19.如何理解.net中的垃圾回收机制。 答:GC?对象创建了总要清除啊,不然内存哪够用?

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧