ALTER PROCEDURE up_LeaveSendCostInputByPrince
@inoarray VARCHAR(6000),@quotename VARCHAR(50),@sendprice NUMERIC(18,2),@lowsendcost NUMERIC(18,2),@note VARCHAR(2000),@uid VARCHAR(15)
有这样一个问题,调用存储过程时,@sendprice,@lowsendcost ,如果传的参数是小于0.1,接收到的参数会乘以100,如传0.02,接收到的参数,就是2,但传0.2,就是正常的;如果参数定义改为NUMERIC(18,3),即3位小数,就会乘以100, with TempProc do
begin
Close;
ProcedureName:='up_LeaveSendCostInputByPrince';
Parameters.Refresh;
Parameters.ParamValues['@inoarray']:=inoarray;
Parameters.ParamValues['@quotename']:=Trim(CbQuote.Text);
Parameters.ParamValues['@sendprice']:=EdtSendPrice.Value;
Parameters.ParamValues['@lowsendcost']:=EdtLowSendCost.Value;
Parameters.ParamValues['@note']:=Trim(EdtNote.Text);
Parameters.ParamValues['@uid']:=Trim(MainFrm.CUid);
showmessage显示的值是正常的,只是用SqlServer Profiler跟踪到的值变了
调用环境是Delphi7
SqlServer中数值参数传递后不正确的问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-08-05 15:36关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
这个问题可能是因为在SQL Server Profiler中使用了"Show Values"功能。这个功能可以在运行时查看变量的当前值,但它并不保证这些值都是正确的。
要解决这个问题,你可以尝试以下方法:
- 使用
SqlString.Format()函数来格式化你的输入字符串。例如:
@sendprice = SqlString.Format("'{0:F2}'", @sendprice);这将确保你对数字进行格式化,并且不会被转换为浮点数。 2. 如果你需要更精确的控制精度,请考虑使用
Decimal类型而不是float或double。例如:@sendprice = Decimal.Parse(@sendprice.ToString());这将确保你在执行计算前就已经将所有数字转换为了整数。
请注意,在实际应用中,最好避免在SQL查询中直接修改参数的值,而是通过设置参数的值来改变数据。这样可以避免潜在的数据错误和性能问题。
解决 无用评论 打赏 举报- 使用