VB.NET 3.5迁Win11 x64后OdbcDataAdapter.Fill触发OverflowException如何解决?
VB.NET 3.5 WinForms应用迁移到Windows 11 64位后ODBC填充DataTable触发OverflowException
问题背景
维护的基于VB.NET 3.5的遗留Windows Forms应用,原在Windows 10 32位系统搭配MySQL ODBC Connector 5.1/5.3运行正常。迁移到Windows 11 64位机器后,未修改源代码或数据库架构,触发如下异常:
System.OverflowException: Arithmetic operation resulted in an overflow. at System.Data.Common.UnsafeNativeMethods.SQLFetchScroll(...) at System.Data.Odbc.OdbcDataReader.NextResult(...) at System.Data.Odbc.OdbcDataReader..ctor(...) at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(...) at System.Data.Odbc.OdbcCommand.ExecuteReader(...) at System.Data.Odbc.OdbcDataAdapter.Fill(...)
问题代码片段:
da = New Odbc.OdbcDataAdapter("SELECT * FROM tblmastertable WHERE line = '" & cmbLine.Text & "' AND model = '" & cmbModel.Text & "'", con) dt = New DataTable() da.Fill(dt)
已排查项
- ✅
machinenumber列为VARCHAR(100) - ✅ 表中无NULL值、无超出范围的大数
- ✅ 测试过相同MySQL版本及ODBC驱动(5.3和8.x)
- ✅ 使用与原环境完全相同的连接字符串
- ✅ 数据库架构未做任何修改
- ✅ 运行的是原VB.NET 3.5编译的AnyCPU版本EXE
- ✅ 每次执行都重新声明
dt As New DataTable - ✅ Windows 10 32位环境下无异常
- ✅ 仅Windows 11 64位环境触发该溢出异常
额外观察
- 异常仅在
da.Fill(dt)执行时触发 - 相同查询在MySQL Query Browser中执行正常
- 查询列数更少的简单表无异常
- 显式重新编译为x86架构无法解决问题
解决建议
1. 配置32位ODBC数据源
Windows 11 64位系统存在两个ODBC数据源管理器:
- 64位:
C:\Windows\System32\odbcad32.exe - 32位:
C:\Windows\SysWOW64\odbcad32.exe
确保通过32位管理器配置数据源,即使程序编译为x86,若指向64位驱动仍可能出现架构不兼容的溢出问题。
2. 避免SELECT *,显式指定查询列
由于查询简单表无异常,推测tblmastertable中部分列的数据类型在64位ODBC驱动下与VB.NET 3.5的类型映射存在冲突。显式列出需要的列,逐步添加排查,定位到触发溢出的具体字段后针对性处理。
3. 调整ODBC连接字符串参数
在连接字符串中添加兼容旧版本的参数,强制驱动使用兼容逻辑:
Driver={MySQL ODBC 5.3 Unicode Driver};Server=xxx;Database=xxx;User=xxx;Password=xxx;UseOldSyntax=true;
4. 转换可疑列数据类型
对可能存在映射问题的列,用CAST函数强制转换类型,例如:
SELECT line, model, CAST(machinenumber AS CHAR(100)) FROM tblmastertable WHERE ...
5. 替换为MySQL原生ADO.NET驱动
VB.NET 3.5兼容MySQL Connector/NET 6.x版本,放弃ODBC驱动改用原生ADO.NET组件,避免ODBC层的类型转换问题。将OdbcDataAdapter替换为MySql.Data.MySqlClient.MySqlDataAdapter,并修改对应连接字符串格式。
内容的提问来源于stack exchange,提问作者John Romel Tinasas




