MySQL 6.0.11中CSV空float值转默认0.0存储如何避免格式异常
问题根因
你遇到的Input string was not in a correct format报错,是C#侧数据转换触发的异常:CSV空单元格读取后得到的是null、空字符串或空白字符串,直接传入Convert.ToSingle()、float.Parse()这类方法时,无法识别空值类输入,就会抛出格式错误,和MySQL、存储过程逻辑无关。
解决方案
核心逻辑是转换前先判断输入是否为空,空值直接返回默认的0.0f,非空值再做格式转换,建议用float.TryParse()做容错转换,避免异常抛出。
步骤1:新增float安全转换辅助方法
在业务代码所在的类中新增如下通用方法:
private static float SafeConvertToFloat(string input, float defaultValue = 0.0f) { // 处理null、空字符串、全空白字符串的情况 if (string.IsNullOrWhiteSpace(input)) { return defaultValue; } // 转换成功返回解析结果,转换失败也返回默认值 return float.TryParse(input.Trim(), out float result) ? result : defaultValue; }
如果你的CSV浮点数字符串用的是英文小数点、且部署环境区域格式不是中文/英文,可指定不变文化做转换,避免区域格式导致的解析失败,修改转换逻辑为:
return float.TryParse(input.Trim(), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out float result) ? result : defaultValue;
步骤2:修改原有业务转换代码
把你业务逻辑中所有Convert.ToSingle(res[x])的调用,全部替换为SafeConvertToFloat(res[x])即可,修改后代码如下:
else if (mpType.Equals("Indices", StringComparison.InvariantCultureIgnoreCase)) { MAE_Repo.InsertNseIndicesPrice("Usp_tbl_Intraday_NseIndicesPrice", 0, Convert.ToInt32(res[0]), res[1], SafeConvertToFloat(res[2]), SafeConvertToFloat(res[3]), SafeConvertToFloat(res[4]), SafeConvertToFloat(res[5]), SafeConvertToFloat(res[6]), SafeConvertToFloat(res[7]), SafeConvertToFloat(res[8]), SafeConvertToFloat(res[9]), SafeConvertToFloat(res[10]), Convert.ToDateTime(res[11]), res[12], timeStamp, filename); }
可选优化(如需存NULL而非0.0到MySQL)
如果业务允许float字段存空值,可调整逻辑用可空float类型,空值时传入DBNull.Value到存储过程:
- 辅助方法返回值改为
float? - 存储过程对应float参数允许为NULL,MySQL表对应字段设置为允许NULL
- 传参时判断如果值为null,参数赋值为
DBNull.Value
注意事项
如果同时存在int类型列的空值,也可以参照相同逻辑写SafeConvertToInt的辅助方法做兼容处理,避免同类格式报错。
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

