BDE对Interbase的支持做的比较简单,它可能考虑了其它几种数据库。
比如在Sybase中Numeric类型其实是Integer类型。为了处理的方便,BDE
把精度位小于15位的Numeric类型转化为Integer,把大于或等于15位的Numeric
转化为Double,由于数据长度固定,带来的好处就是提高效率。BDE和Delphi
的开发者们认为任意固定长度的浮点数类型(如常用的Numeric(m,n))在做
Sum、AVG等计算上会大大的丧失效率,所以计算时是它是采用两种定长的数
据格式,而变长浮点格式只是一种表示的问题,应把解决的方法放在数据的
应用上,而不是放在数据的存储上。所以Delphi的TFloatField提供了
Precision属性限制数据显示的精度,也提供了DisplayFormat属性限制了
显示和编辑的格式。所以这并不是Delphi的Bug,而是做的一种优化策略。
IB提供了Numeric数据类型,但存储时也是按Float(<15位)、或Double
(>=15位)两种格式存放,所以你存储类型为Numeric(8,2)的数据1234.5678
时并没有存为1234.56而是1234.5678,只是被ISQL显示为1234.56,关于这
一点你可以建立一个Numeric(15,2) Field, 然后分别在ISQL中和SQL Exporler
中得到证实。
对于你的问题,我有一个方法以供参考:
比如你想建立一个固定小数的Numeric(8,3), Do
1.
CREATE TABLE TB1(
F1 NUMERIC(15,3) /*让BDE转化为Double类型*/
);
2. 用BDE连接IB
3. 在Delphi中建立控件TB_DELPHI1:TTable连接TB1;
4. DoubleClick TB_DELPHI1,加入域F1;
5. 修改F1的属性:
DisplayFormat = '#####0.###';
Precision = 8 ;
如此让F1在显示时按8,3格式显示和编辑, 但存储时按Double存储。
同你一样,我也很讨厌BDE的这种毛病,但无奈它有另一套想法。
不知有没有给你满意的答复!我快穷疯了。