首页 新闻 会员 周边

关于dataReader给Ilist赋值的问题

0
悬赏园豆:60 [已解决问题] 解决于 2010-04-28 17:15
代码
using (IDataReader reader = helper.CreateQuery(sql_getComments).ExecuteReader())
{
if(reader.read())
{

commentsList
= BindObject.BindObjectToInstance(typeof(Comment), reader);
}
}

这样获取数据时会丢失第一条数据,而如果去掉

if(reader.read())这句后则可以正确获取数据。

请问,datareader在给Ilist赋值时为什么不能加入if(reader.read())?谢谢!

问题补充: 谢谢各位啊!我明白了!
幽灵龙的主页 幽灵龙 | 初学一级 | 园豆:120
提问于:2010-04-28 12:58
< >
分享
最佳答案
0
if(reader !=null)
{

commentsList
= BindObject.BindObjectToInstance(typeof(Comment), reader);
}
收获园豆:30
Astar | 高人七级 |园豆:40805 | 2010-04-28 13:09
能具体说一下reader.read()为什么不能实现吗?
幽灵龙 | 园豆:120 (初学一级) | 2010-04-28 13:41
@幽灵龙:read()是一个方法,意思就是“前进到下一条记录”,执行一次就少一条。
Astar | 园豆:40805 (高人七级) | 2010-04-28 15:04
@Astar:嗯 这个我明白了。但是我没想通:1.如果我只取一条数据,“select top 1 * from a”,这个时候我使用reader.read()的时候却是可以的,这是为什么呢? 2.while(reader.read())和if(reader.read())是否一样,或者这两者之间有什么区别吗? 不好意思啊,我对这方面不是很懂。麻烦了啊!
幽灵龙 | 园豆:120 (初学一级) | 2010-04-28 15:24
@幽灵龙:while(reader.read())是循环一直读到reader结束,而if(reader.read())只是判断里面是否有记录,也就是它是否为NULL对象。现在我很少用DataReader,常用DataTable.
Astar | 园豆:40805 (高人七级) | 2010-04-28 16:06
if(reader.read())和while(reader.read())效果是一样的,执行完后,当前记录都无法在获取了
上不了岸的鱼 | 园豆:4613 (老鸟四级) | 2010-04-28 17:14
其他回答(2)
0

SqlDataReader是单向只读的,Read ()之后当前记录就无法获取了,你可是使用HasRows属性判断SqlDataReader是否有数据,然后再执行绑定,这样就不会丢失第一条数据了

收获园豆:15
上不了岸的鱼 | 园豆:4613 (老鸟四级) | 2010-04-28 14:58
可以了,但是我就不明白为什么reader.read()不行呢?这其中有什么原因不?
支持(0) 反对(0) 幽灵龙 | 园豆:120 (初学一级) | 2010-04-28 15:01
如果你使用Read()方法,那么你一旦遍历完所有的记录,这时候再去遍历SqlDataReader,其中就没有任何数据了。单向,只读,比DataSet或Table提供更好的性能,但是功能相对少。
支持(0) 反对(0) 上不了岸的鱼 | 园豆:4613 (老鸟四级) | 2010-04-28 17:17
0

...

while(dr.Read())
{
   sb.Append(dr["temp"].ToString());
}

这是我们通常reader用法,可见,每 dr.Read() 一次,对read的记录指向就会向后推一条.

那么 “if(reader.read() 判断一次,同样向后推一条记录,这样邦定里就少一条

我用很少用控件,不过我想 这个List控件可能是有对 reader记录的判断,你可以把为空的if去掉,直接邦试试,为空时报不报错,当然,判断一个是否为null也挺好

收获园豆:15
千羽 | 园豆:666 (小虾三级) | 2010-04-28 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册