获取tblStocks表中以11开头的最新Item_Code报错排查及实现
解决System.InvalidOperationException错误并获取最新Item_Code
问题根源
你的代码触发System.InvalidOperationException: 'No data exists for the row/column.'有三个核心原因:
- SQL语句中错误地将
@item_code用作列别名,@是参数占位符的标识,不能直接当别名使用 - 调用
ExecuteReader后,没有调用DataReader.Read()方法定位到数据行,DataReader初始位置在第一行之前,直接访问列会报错 LAST()函数依赖数据存储顺序,兼容性差,且不一定能准确获取"最新"的Item_Code(通常我们需要的是最大的编码值)
修正后的完整代码
' 修改SQL语句,用MAX()获取最大的Item_Code,使用合法别名 Dim sql As String = "SELECT MAX(Item_Code) AS latest_item FROM tblStocks WHERE Item_Code LIKE '11%'" ' 使用Using语句自动释放资源,避免内存泄漏 Using cmd As New OleDbCommand(sql, cn) Using dr As OleDbDataReader = cmd.ExecuteReader() ' 先判断是否有数据行 If dr.Read() Then ' 读取列值,注意用别名latest_item txtAvailable.Text = dr("latest_item").ToString() Else ' 没有符合条件的数据时的处理 txtAvailable.Text = "无匹配数据" End If End Using End Using
关键修正点说明
- SQL语句优化:用
MAX(Item_Code)替代LAST(Item_Code),因为你的Item_Code是递增的编码格式,MAX()能直接获取最大(最新)的符合条件的值,且兼容大多数数据库;同时将别名改为latest_item,避免参数占位符冲突 - DataReader读取逻辑:必须调用
dr.Read()来移动到第一行数据,返回值为True表示存在有效数据,此时才能安全访问列值 - 资源管理:用
Using语句包裹OleDbCommand和OleDbDataReader,确保数据库连接相关资源能自动释放,避免连接泄漏
内容的提问来源于stack exchange,提问作者Fritz Baider
相关产品推荐
相关产品推荐

