我遇到一个问题,看起来读者表明它有返回SQL的行,但读者的while循环从不运行。我把一个消息框放在reader.hasrows作为验证,我在while循环之后的第一行放了一个消息框。执行hasrows的消息框,但不执行Read的消息框。这非常令人费解。我尝试了对数据库的查询,它确实返回了行。这是代码段。
using (DbConnection connection = CADBase.DbProviderFactory.CreateConnection())
{
connection.ConnectionString = CADBase.DbConnectionString;
connection.Open();
using (DbCommand command = connection.CreateCommand())
{
SQL = <statement here>;
command.CommandText = SQL
using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
//NEVER MAKES IT HERE
}
}
}
}
答案 0 :(得分:1)
对于此问题的未来读者:请注意问题是因为OP在查询中返回了太多列。请参阅以下评论中的评论。
我不太确定为什么会这样,但你真的只需要检查一次行,而不是两次,而Read()
方法已经这样做了。
所以你真正需要的是
while (reader.Read())
{
// Do your thing
}
答案 1 :(得分:0)
在第一次调用read
之前调用MoveNext()答案 2 :(得分:0)
你应该使用reader.HasRows属性而不是方法。
答案 3 :(得分:0)
也许你在reader.Read()
上获得了例外。
但是HasRows
是属性而不是方法。你需要编写if(reader.HasRows)
来编译它。
if(reader.HasRows)
{
//MAKES IT HERE
while (reader.Read())
{
//NEVER MAKES IT HERE
}
}
所以我想知道实际的代码是什么。
答案 4 :(得分:0)
只是一个猜测。也许你正在读取reader.HasRows之后和reader.Read()之前显示的消息框中的读者对象。显然,只有当读者没有到达最后一行时,Read()方法才返回true(参见:https://stackoverflow.com/a/1540626/516481)。因此,如果读者在最后一行,它将返回false!也许查询只返回一行,你通过访问它(可能使用调试器)并将阅读器移到最后一行来以某种方式更改阅读器对象的内部状态?