数据库按折扣修改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
相关产品推荐
相关产品推荐

