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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:25:03