delphi4的interbase驱动问题(100分)

H

hdq

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi4的bde连接interbase5.0数据库,用database desktop建表
时,它总将numeric型的变为long型,用odbc的驱动方式则无此问题,请
指教。
 
为了这可观的100分, 特意查了一下, numeric 是一个泛指的数值类型, 所以不能
使用他来建表, 应该给出具体类型才行
 
那么,用Database Desktop建InterBase表时,应选择什么类型来固定数据的
小数点后位数?我不想用odbc.
 
我不知道你为何一定要固定小数点的位数。IB(Interbase)不同于FoxPro, 前者好像没有固定小数点的概念,dBase存放在文件中的Numeric Field是按ASCII格式存放的,IB中一般带小数点的浮点型按照精度以IEEE规定的格式存放,而每一种精度的数据其小数点的位数是一定的。
为了在表示上得到固定的小数点位数,在程序中可用Format或FloatToStrF将取得的Float数据格式化成你所需的位数,这样做也不麻烦。或干脆用Char(n)类型存放,不过这样做编程就有些麻烦了。
  如果直接用IB的Float类型有些不习惯,可用IB中的Domain定义你自己的类型, 如NumericPrecision,然后将它与Float联系起来。
 
谢谢二位,可我在IB的ISQL可以设N型的数据类型,也能正常使用,用IB自己带的ODBC驱动也行,应说明IB支持N型,是否DELPHI对IB的支持有BUG?若是,我将把
分数的大部分给提出证据的朋友。
 
  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的这种毛病,但无奈它有另一套想法。

  不知有没有给你满意的答复!我快穷疯了。
 
to walkdan;你至少已经得到50块大洋了。
我想做的是将ORACLE的表转到IB上,只因为IB的SERVER能装在95/98上,我
又不想改程序,如有高招请指教。
 
  首先感谢宝贵的50两。
  Oracle能能很好的支持Numeric(m,n)类型, 可惜IB的SQL link不争气,
爱把冯京当马凉,如果又不用ODBC又不想改程序,这...有些难了!
  我想如果仅仅只转换,Oracle的数据能很好的呆在IB里,用Database Desktop
等工具就可以干这件事。但问题是在IB中呆的好好的Numberic数据被IB一Link起来
后在BDE上的显示和编辑就不是那么回事了。
  到是有一低招:
假设你又一Field F1 was defined as Numberic(8,3)
  1. 按照你Oracle的表格式在IB建立表(假设为T1)。
  2. SQL Explorer中打开T1,
  3. 察看/Tables/T1/Columns/F1
其结果是你的Numberic(8,3)类型被改成了INTEGER类型,此时你要强行的
    将它又改过来:
    Type -> Numberc
Length ->8
4. Apply modified table

如此你的Number至少不会是个Long型,它是一个Number,但可能你的程序中对
改数据的显示和修改会出问题。建议你可以适当的改改程序。
 
看来我只能将该问题打住,huizhang10分,walkdan90分,我去改程序!花了
钱还没偷成懒,我好命苦啊!
 

Similar threads

回复
0
查看
677
不得闲
S
回复
0
查看
949
SUNSTONE的Delphi笔记
S
S
回复
0
查看
770
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部