最近在做一个小的工具使用中,使用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位以上的小数的值了。