读取结果集遇致命错误:MySQL 5.6+VB.NET排查求助
问题背景
以下VB.NET代码在执行da.Fill(dtOnline)时触发错误Fatal error encountered attempting to read the resultset:
Dim da As MySqlDataAdapter = New MySqlDataAdapter Dim dtOnline As DataTable = New DataTable Dim sql As String = "SELECT ID, Description FROM stocklocations WHERE CoID = @CoID AND ShopID = @ShopID" Using con As MySqlConnection = New MySqlConnection(gen.connStringOnline) Using cmd As MySqlCommand = New MySqlCommand(sql, con) cmd.Parameters.AddWithValue("@CoID", gen.CoID) cmd.Parameters.AddWithValue("@ShopID", gen.shopID) cmd.CommandTimeout = 86400 da.SelectCommand = cmd con.Open() da.Fill(dtOnline) con.Dispose() End Using End Using
已完成排查:
- 单独执行
con.Open()可正常建立连接 - 已设置命令超时为86400秒
- MySQL Workbench可正常连接服务器并执行读写操作
额外排查方向
验证Connector/NET版本兼容性
MySQL Server 5.6对Connector/NET版本有适配要求,过高版本(如8.0+)可能存在协议兼容问题。建议切换到适配5.6的稳定版本,比如6.9.x或6.10.x系列。显式指定参数类型
AddWithValue会自动推断参数类型,可能与数据库中CoID、ShopID的字段类型不匹配(例如数据库是INT类型,代码传入字符串)。替换为显式指定类型的写法:cmd.Parameters.Add("@CoID", MySqlDbType.Int32).Value = gen.CoID cmd.Parameters.Add("@ShopID", MySqlDbType.Int32).Value = gen.shopID根据实际字段类型调整
MySqlDbType的值。查看服务器端错误日志
登录MySQL服务器查看错误日志(通常路径为/var/log/mysql/error.log或安装目录下的data文件夹),日志中会包含更详细的报错细节,比如结果集读取时的网络中断、表损坏、权限限制等。测试简化查询
先执行不带参数的固定值查询,例如:Dim sql As String = "SELECT ID, Description FROM stocklocations WHERE CoID = 1 AND ShopID = 1"如果能正常返回结果,说明参数传递或绑定存在问题;如果仍报错,可能是表数据本身的问题(如大字段、特殊字符)。
检查网络稳定性
连接建立成功不代表数据传输过程稳定,可通过ping、traceroute工具测试客户端到服务器的网络连通性,查看是否存在丢包、延迟过高的情况。也可以在服务器本地执行相同查询,排除网络因素。确认账号权限细节
确保代码使用的数据库账号对stocklocations表拥有SELECT权限,且能访问该表所在的数据库。Workbench使用的账号可能与代码账号权限范围不同。限制结果集大小测试
如果查询返回的结果集过大(如几十万条以上),可能引发内存不足或传输超时。先添加LIMIT 10限制返回行数,测试是否能正常填充DataTable。移除手动释放连接的代码
代码中使用了Using语句,会自动释放连接资源,手动调用con.Dispose()可能导致资源提前释放,引发读取结果集时的错误,建议删除该行。
内容的提问来源于stack exchange,提问作者Percy Kumah

