You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中MySqlCommand为何将12.5转为12,5引发插入异常?

为什么MySqlCommand会把12.5转回12,5触发异常?

这个问题我之前也踩过坑,核心原因其实是两个点:你可能在直接拼接SQL字符串,而且.NET的数值格式化会受当前线程的文化区域影响,导致你替换好的小数点又被打回原形。

问题出在哪?

你代码里把"12,5"替换成"12.5",并用InvariantCulture解析成double值这一步是没问题的,但如果接下来你是直接把double值拼进SQL字符串,比如写了类似这样的代码:

string sql = $"INSERT INTO your_table (sensor_value) VALUES ({capteurValue})";

这时候.NET会用当前线程的默认文化(比如你的系统是法语、德语这类用逗号做小数点的区域)把double值转成字符串,于是12.5又变成了12,5,传到MySQL自然就触发格式异常了。

怎么解决?

最稳妥也是最推荐的方案是用参数化查询,完全绕开字符串格式化的问题:

string valueCapteur = "12,5";
double capteurValue;
// 用InvariantCulture解析确保逗号转成正确的double值
double.TryParse(valueCapteur, NumberStyles.Any, CultureInfo.InvariantCulture, out capteurValue);

// 用参数占位符代替直接拼接数值
string sql = "INSERT INTO your_table (sensor_value) VALUES (@SensorValue)";
MySqlCommand cmd = new MySqlCommand(sql, yourConnection);

// 添加参数,让MySqlCommand自己处理数值传递
cmd.Parameters.AddWithValue("@SensorValue", capteurValue);
// 或者更严谨地指定类型(推荐)
// cmd.Parameters.Add("@SensorValue", MySqlDbType.Double).Value = capteurValue;

cmd.ExecuteNonQuery();

参数化查询的好处在于:它不会把double值转成字符串再拼接,而是直接把二进制的数值传递给MySQL,完全不受文化区域的影响,还能防止SQL注入,一举两得。

如果你实在要手动处理字符串(非常不推荐),那一定要强制用InvariantCulture来格式化数值:

string formattedValue = capteurValue.ToString(CultureInfo.InvariantCulture);
string sql = $"INSERT INTO your_table (sensor_value) VALUES ({formattedValue})";

但这种方式还是有SQL注入的风险,所以优先选参数化。

内容的提问来源于stack exchange,提问作者MrB3NiT0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:12:08