VB.NET中MySqlDataReader读取存储过程结果集丢失首行问题
问题原因
你丢失首行的核心原因是代码中多余调用了result.Read()方法:
MySqlDataReader的Read()方法会将指针向前移动到下一行,你在调用RData.Load(result)之前手动执行了一次result.Read(),已经读取了当前结果集的第一行DataTable.Load()方法内部会自动从DataReader的当前指针位置开始,遍历所有剩余行加载到DataTable中,因此第一行被你提前读取后,Load方法就看不到这一行数据了
修复方案
直接删除While result.HasRows代码块里的result.Read()调用即可,修改后代码如下:
Dim RData As DataTable = New DataTable comando.CommandText = String.Format("call EmailPagoCliente({0},{1},{2},{3})", numCliente, IDPR, IDRes, IDCC) conex.Open() result = comando.ExecuteReader While result.HasRows RData.Clear() RData.Load(result) correo.Data = RData.Copy End While conex.Close()
补充说明
- 如果你需要判断当前结果集是否为空,可以直接通过加载后的
RData.Rows.Count判断,不需要提前读取行 - 多结果集遍历的逻辑不需要调整,
DataTable.Load()加载完当前结果集后,会自动将DataReader的指针移动到下一个结果集的起始位置,result.HasRows可以正常判断下一个结果集是否存在数据 - 你提到的存储过程逻辑没问题,就是因为客户端代码多了一次Read调用导致的首行丢失,和存储过程本身无关
内容的提问来源于stack exchange,提问作者Diginet
相关产品推荐
相关产品推荐

