按ID比对DataGridView与MySQL数据触发MySqlException错误如何解决
报错修复与代码优化说明
错误直接原因
你触发报错的核心原因是:MySqlDataReader 调用 ExecuteReader() 后必须先执行Read()方法移动游标到返回的结果行,才能读取字段值,你跳过了这一步直接访问Quantity字段,因此抛出异常。
代码中存在的其他问题
- SQL参数使用错误:你给
@Stock加了单引号,会被MySQL识别为普通字符串而非参数,且你完全没有给@Stock赋值,没有传入当前DataGridView行对应的ID值,查询永远返回空结果 - 资源未释放:每次循环创建的
MySqlDataReader使用后没有关闭,会导致数据库连接泄漏,后续数据库操作会触发连接占用报错 - 比较逻辑错误:你将库存数值转为字符串做大小比较,会出现
"10" < "2"这类逻辑错误,必须转为数值类型比对 - 变量名写错:第二个判断分支里的
Sum_Result.Text不存在,你之前定义的是Sum_Quantity.Text - 结果覆盖问题:你遍历所有行的过程中每次都会给
Sum_Outcome.Text赋值,最终文本框只会显示最后一行的比对结果,若要保留所有行的结果需要调整逻辑
修复后代码
Dim cmd As MySqlCommand Dim READER As MySqlDataReader ' 先确认你的ID列在DataGridView的索引,我这里假设是第0列,你根据实际情况调整 Const ID_COL_INDEX As Integer = 0 Const TARGET_COL_INDEX As Integer = 4 For i = 0 To DataGridView1.Rows.Count - 1 ' 跳过新行模板(如果DataGridView允许用户新增行的话) If DataGridView1.Rows(i).IsNewRow Then Continue For Dim Query As String = "SELECT Quantity FROM `database`.`stockroom` WHERE `ID`= @Stock" cmd = New MySqlCommand(Query, MysqlConn) ' 给参数赋值,取当前行的ID cmd.Parameters.AddWithValue("@Stock", DataGridView1.Rows(i).Cells(ID_COL_INDEX).Value.ToString()) READER = cmd.ExecuteReader() ' 先调用Read判断有没有查询到结果 If READER.Read() Then ' 转为数值类型比较 Dim dbQty As Integer = READER.GetInt32("Quantity") Dim gridQty As Integer = Integer.Parse(DataGridView1.Rows(i).Cells(TARGET_COL_INDEX).Value.ToString()) Sum_Quantity.Text = dbQty.ToString() If dbQty >= gridQty Then Sum_Outcome.Text = "Stock remains above or equals 0" Else Sum_Outcome.Text = "Stock falls below 0" End If Else ' 没有查询到对应ID的库存,可自定义提示 Sum_Outcome.Text = "未查询到对应ID的库存数据" End If ' 用完立即关闭DataReader READER.Close() Next
额外优化建议
如果你只需要获取单个查询值,建议直接用ExecuteScalar()替代MySqlDataReader,代码更简洁也不容易出资源泄漏问题,替换示例如下:
' 替换上述READER相关代码即可 Dim dbQty As Integer = Convert.ToInt32(cmd.ExecuteScalar())
内容的提问来源于stack exchange,提问作者Ali_D
相关产品推荐
相关产品推荐

