关于在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位以上的小数的值了。

 

 

你可能感兴趣的:(sql,Delphi)