关于在Delphi中使用Adoquery插入数据小数位数精度丢失的问题

最近在做一个小的工具使用中,使用adoquery插入数据到数据库中时候,如果字段的值超过4位小数,则会被截断。

 

假设SqlServer数据库中存在如下表

materialInfo  (pno,vendor,description,price)

 

其中price字段在数据库中的定义类型为 numeric (18,6),即有6位小数精度。 但我在前台窗口中使用adoquery进行插入时候,则始终截断为4位小数,原代码如下:

...
var
    adoquery1:Tadoquery;
begin
    adoquery1:=Tadoquery.create(nil);
    try
       if not DM.adonconnection1.connected then
           DM.adoconnection1.connected:=true;
       adoquery1.adoconnection:=DM.adoconnection1;
       with adoquery1 do
       begin
           close;
           sql.clear;
           sql.add('insert into materialInfo values(:tmppno,:tmpvendor,:tmpdesc,:tmpprice)');
           parameters.parambyname('tmppno').value:=trim(edit1.text);
           parameters.parambyname('tmpvendor').value:=trim(edit2.text);
           parameters.parambyname('tmpdesc').value:=trim(edit3.text);
           parameters.parambyname('tmpprice').value:=trim(edit4.text);
           execsql;
       end;
    finally
        adoquery1.free;
    end;
end;

 使用如上代码插入后,如果字段price 值为 0.005589,但插入到数据库中显示的值为0.0055,最后四位被截断。

 

在网上搜索下,查看了delphi帮助,需要将adoquery1的enableBCD设置为false,

即 adoquery1.enableBCD:=Fase;

 

delphi帮助是这样说的:T

his is because TBCDField uses the currency datatype that has a fixed scale of 4 decimal places.

BCD字段类型使用了货币类型,这种类型是小数点后是4位数。

 

但改成false后,仍然出现插入的数据还是4位,以上设置能解决使用adoquery查询显示时显示6位,但不能保证插入时候也是6位,插入时候仍是4位。

 

最后解决方法是将参数中的tmpprice的数据类型设置为ftFloat,即可。完整代码如下:

...
var
    adoquery1:Tadoquery;
begin
    adoquery1:=Tadoquery.create(nil);
    try
       if not DM.adonconnection1.connected then
           DM.adoconnection1.connected:=true;
       adoquery1.connection:=DM.adoconnection1;
       adoquery1.enableBCD:=False;       //禁用bcd类型
       with adoquery1 do
       begin
           close;
           sql.clear;
           sql.add('insert into materialInfo values(:tmppno,:tmpvendor,:tmpdesc,:tmpprice)');
           parameters.parambyname('tmppno').value:=trim(edit1.text);
           parameters.parambyname('tmpvendor').value:=trim(edit2.text);
           parameters.parambyname('tmpdesc').value:=trim(edit3.text);
           parameters.parambyname('tmpprice').datatype:=ftFloat;       //设置下数据类型
           parameters.parambyname('tmpprice').value:=trim(edit4.text);
           execsql;
       end;
    finally
        adoquery1.free;
    end;
end;

 这样一来,可以插入4位以上的小数的值了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值