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

数据库按折扣修改HT金额时遇乘法运算符数据类型错误求助

解决SQL乘法运算时的nvarchar类型错误

这个报错的根源很明确:你传入的折扣(@remise)和单价(@pu)参数是字符串类型(nvarchar),而SQL Server不支持对字符串直接使用乘法运算符。问题出在你调用AddWithValue时,直接传入了文本框的Text属性——AddWithValue会根据传入值的.NET类型自动推断SQL参数类型,字符串自然就被映射成nvarchar了,可数据库里的DL_Remise01REM_Valeur和DL_PrixUnitaire应该是数值类型(比如decimal或float)。

修复方案

你需要先把文本框的字符串内容转换成数值类型,再传入参数,这样数据库就能正确识别并执行乘法运算了。这里推荐用decimal类型,因为涉及金额计算,精度更可靠。

修改后的代码示例

// 先定义数值变量,用于存储转换后的结果
decimal remiseValue;
decimal puValue;

// 先验证并转换输入(避免非数字输入导致异常)
if (!decimal.TryParse(textBox_rem.Text, out remiseValue))
{
    // 这里可以加错误提示,比如MessageBox.Show("折扣必须是有效数字");
    return;
}
if (!decimal.TryParse(textBox_prix.Text, out puValue))
{
    // 错误提示:单价必须是有效数字
    return;
}

// 构建SQL命令
comm.CommandText = "UPDATE F_DOCLIGNE SET DL_DateBC = @date, DL_Remise01REM_Valeur = @remise, DL_PrixUnitaire = @pu, DL_MontantHT = (@remise * @pu) / 100 WHERE AR_Ref = @code";

// 传入转换后的数值参数
comm.Parameters.AddWithValue("@date", textBox_livr.Text);
comm.Parameters.AddWithValue("@pu", puValue); // 这里传decimal类型
comm.Parameters.AddWithValue("@code", textBox_art.Text);
comm.Parameters.AddWithValue("@remise", remiseValue); // 这里传decimal类型

额外建议

  • 永远不要直接把字符串类型的金额/数值传入数据库做计算,不仅会引发类型错误,还可能带来SQL注入风险(虽然你用了参数化查询已经避免了注入,但类型问题还是要重视)。
  • 用TryParse而不是直接Parse,可以优雅处理用户输入非数字的情况,避免程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:31