You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动