仅本机环境IfxDataReader读取小数触发FormatException异常求助
通过IfxDataReader读取Informix数据库Decimal类型字段时,在myReader("decimalValue")处触发System.FormatException,异常堆栈指向数值解析逻辑,相同代码在其他设备运行正常,仅本机复现问题。
复现代码如下:
Using myCon As New IfxConnection("CONSTRING") Dim myQuery = "SELECT decimalValue FROM exampletable" Using myCmd As New IfxCommand(myQuery, myCon) myCon.Open() Using myReader As IfxDataReader = myCmd.ExecuteReader While myReader.Read ' 错误触发位置 Dim myVariable As Double = myReader("decimalValue") End While End Using End Using End Using
异常堆栈信息:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
at IBM.Data.Informix.IfxDataReader.GetSytemTypeFromCacheType(Type systemType, Type cacheEntryType, Object cacheEntry)
at IBM.Data.Informix.IfxDataReader.GetValue(Int32 i)
at IBM.Data.Informix.IfxDataReader.get_Item(String value)
当前使用的IBM.Data.Informix DLL文件版本为4.0.1000.2,产品版本为4.00.01000.2,已正确引入命名空间、添加引用,安装Informix Client SDK后问题未解决。
该问题是本机系统区域数字格式配置与旧版Informix驱动的内置解析逻辑不兼容导致:你使用的4.0.1000.2版驱动在通过索引器读取字段值时,会依赖系统全局的数字格式配置做字符串到Decimal的转换,一旦本机配置的小数点、千位分隔符和驱动预期的格式不匹配,就会触发解析异常,和是否安装Client SDK无直接关联。
按优先级依次尝试以下方案:
- 修正系统数字格式配置:打开控制面板-区域-其他设置,确认小数点符号设置为
.,千位分隔符设置为,,不要使用中文标点、空格等特殊符号作为分隔符,保存后重启VS再运行代码验证。 - 替换驱动版本:将项目引用的IBM.Data.Informix.dll替换为同事正常运行环境中同版本的DLL,不要使用本机GAC中注册的其他版本,重新添加引用后测试。
- 绕开驱动内置的自动转换逻辑:不要直接用索引器取值,改用显式类型读取方法规避解析bug,代码示例:
' 先获取目标列的序号 Dim colIndex As Integer = myReader.GetOrdinal("decimalValue") ' 直接调用GetDecimal方法读取,跳过索引器的自动类型转换流程 Dim myVariable As Double = Convert.ToDouble(myReader.GetDecimal(colIndex))
- 统一.NET运行时版本:检查项目目标框架版本是否和同事正常运行的环境一致,部分旧版Informix驱动在.NET Framework 4.7及以上版本中存在数值解析兼容问题,可以临时将项目目标框架调整为.NET Framework 4.5测试。
- 排查干扰软件:临时退出本机安装的输入法增强、系统美化、全局快捷键类第三方软件,这类软件可能Hook系统默认的数字格式配置,导致驱动读取到错误的格式信息。
内容的提问来源于stack exchange,提问作者Waldi

