NpgsqlDataReader读取数据时跳过第一行的问题排查
问题原因与修复方案
你的代码存在逻辑错误,核心问题是对DbDataReader的遍历逻辑理解错误:
while (r.Read())已经是在逐行遍历数据库返回的结果,每次Read()成功就表示当前指针定位到了一行有效数据。- 而
foreach (var item in r)遍历的是当前行的所有列字段,不是行。你把列字段强制转成DbDataRecord本身就是错误操作,这会导致数据读取逻辑混乱,出现行数据丢失的情况。
你看到的“仅获取3行”是错误逻辑下的巧合结果,实际代码根本没有正确遍历所有返回行。
修复后的代码
connection.Open(); using (var r = command.ExecuteReader()) { // 逐行遍历结果集 while (r.Read()) { // 当前的DbDataReader实例本身就可转换为DbDataRecord var dbRecord = (System.Data.Common.DbDataRecord)r; result.Add(VisualTsTableMapper.MapFromDbRecord(dbRecord)); } } connection.Close();
额外优化建议
可以把数据库连接也用using包裹,确保连接自动释放,避免手动关闭可能出现的遗漏:
using (var connection = new SqlConnection(yourConnectionString)) { connection.Open(); using (var command = new SqlCommand(yourQuery, connection)) using (var r = command.ExecuteReader()) { while (r.Read()) { var dbRecord = (System.Data.Common.DbDataRecord)r; result.Add(VisualTsTableMapper.MapFromDbRecord(dbRecord)); } } }
内容的提问来源于stack exchange,提问作者Kęstutis Ramulionis
相关产品推荐
相关产品推荐

