C# Windows Forms插入美元金额到SQL时提示‘输入字符串格式不正确’
解决C# WinForms插入SQL Decimal时的"Input string was not in a correct format"错误
这个错误十有八九是字符串转Decimal时的格式不匹配或者空值处理不到位导致的——毕竟你的quoteAmount1列允许为空,文本框也可能是空的,直接硬用Convert肯定容易踩坑。下面给你几个实用的解决方案:
方案1:用Decimal.TryParse做安全转换(首推)
这是最稳妥的方式,既能处理合法的金额输入,也能妥善应对空文本或者格式错误的情况,还能避免抛出异常:
decimal quoteValue; // 尝试解析文本框内容,指定不变文化避免区域设置差异导致的解析失败 bool isParsed = decimal.TryParse(quote1.Text, NumberStyles.Currency | NumberStyles.Number, CultureInfo.InvariantCulture, out quoteValue); // 根据解析结果设置参数,同时适配数据库Decimal(8,2)的精度要求 if (isParsed) { cmd.Parameters.Add("@quoteAmount1", SqlDbType.Decimal).Value = Math.Round(quoteValue, 2); } else { // 解析失败(空文本、非法格式)时,设置为数据库的空值 cmd.Parameters.Add("@quoteAmount1", SqlDbType.Decimal).Value = DBNull.Value; }
为啥要加CultureInfo.InvariantCulture?举个例子:如果你的系统区域设置是欧洲地区(用逗号当小数点),输入1300.00会直接解析失败,用不变文化可以强制按点号作为小数点处理,适配标准的金额输入习惯。
方案2:简化空值处理(适合明确输入规则的场景)
如果你的业务逻辑里,文本框要么是合法数字要么是空,也可以用这种更简洁的写法,但要注意:如果用户输入了非法格式(比如字母)还是会抛异常,所以只适合有输入限制的场景:
cmd.Parameters.Add("@quoteAmount1", SqlDbType.Decimal).Value = string.IsNullOrWhiteSpace(quote1.Text) ? DBNull.Value : decimal.Parse(quote1.Text, CultureInfo.InvariantCulture);
额外优化建议
- 给文本框加输入限制:在
KeyPress事件里过滤非法字符,从源头减少格式错误的可能:
private void quote1_KeyPress(object sender, KeyPressEventArgs e) { // 只允许数字、小数点、退格键 if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.') { e.Handled = true; } // 限制只能输入一个小数点 if (e.KeyChar == '.' && ((TextBox)sender).Text.IndexOf('.') > -1) { e.Handled = true; } }
这样用户就没法输入字母、多个小数点这类无效内容,从根源降低转换失败的概率。
内容的提问来源于stack exchange,提问作者RAD
相关产品推荐
相关产品推荐

