MySQL DataReader仅读取首行数据,无法获取全部记录求助
首先纠正一个核心概念误解:MySqlDataReader.FieldCount返回的是当前查询结果的列数量,不是所有行的字段总数。你的查询返回7列,所以它的值始终为7,这是完全正常的,并非代码bug。你提到的“总计21个字段”是3行×7列的总数据项数,但FieldCount并不统计这个数值。
接下来针对你“仅读取到首行”的疑问,分点排查可能的问题:
1. 先确认数据库实际数据量
直接在MySQL客户端执行你的SQL语句:
SELECT e.EmployeeID, e.FirstName, e.LastName, e.email, e.dni, e.phone, e.SpecialityID from Employee e
查看返回的行数是否为3条。如果实际只有1条数据,那问题出在数据本身,和代码无关。
2. 检查GetReader方法的资源释放问题
你在CmdDatabase.GetReader中执行oCommand.Dispose()后返回reader,这可能导致reader无法正常读取后续行。因为MySqlDataReader依赖于对应的MySqlCommand实例,提前释放命令会破坏读取流程。修改方法如下:
public static MySqlDataReader GetReader(string strQuery, string CN) { MySqlConnection oConnection = new MySqlConnection(CN); MySqlCommand oCommand = new MySqlCommand(strQuery, oConnection); oConnection.Open(); // 不要在这里Dispose oCommand,reader会在关闭时自动关联释放资源 return oCommand.ExecuteReader(CommandBehavior.CloseConnection); }
3. 验证循环执行次数
在while(reader.Read())循环中添加计数日志,确认循环是否执行了3次:
int rowCount = 0; while (reader.Read()) { rowCount++; // 原有实例化clsEmployee的代码 } // 输出rowCount的值,若为3则说明所有行已读取
4. 字段名大小写匹配问题
MySQL在不同操作系统下对字段名大小写敏感程度不同(Linux敏感、Windows不敏感)。你的代码中查询语句用e.FirstName,但读取时用reader["firstname"],虽然多数情况下能正常匹配,但建议统一大小写,或直接使用索引(如reader[1])读取字段,避免潜在的匹配异常。
关键结论
如果employees.Count最终为3,说明所有行都已成功读取,你只是误解了FieldCount的含义;如果employees.Count为1,按照上述步骤逐一排查即可定位问题。
内容的提问来源于stack exchange,提问作者gonzaloev

