使用TADOQuery转换负数

时间:2013-04-24 18:27:33

标签: oracle delphi casting activex bcd

TADOQuery我遇到了很大的问题:

这是我的SQL:

select cast(-10 as number(9)) foo, -10 bar 
  from dual

当您添加“foo”字段时,将创建TIntegerField而不是TBCDField,因为此时类型已更改:

procedure TCustomADODataSet.InternalInitFieldDefs;

    if (F.Type_ = adNumeric) and (F.NumericScale = 0) and
       (F.Precision < 10) then
      FieldType := ftInteger;

功能:

function TCustomADODataSet.GetFieldData(Field: TField; Buffer: Pointer;
  NativeFormat: Boolean): Boolean;

此时不考虑信号:

    ftAutoInc, ftInteger:
      Integer(Buffer^) := lVal;

TIntegerField的tagVariant值为:

(14,32768,0,0,10,10,10,1.4012984643e-44,49406564584e-323,True,10,0.001,4.9406564584e-323 ,, $ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A'',$ A,$ A,$ A,$ A,$ A,#10,10 ,10,10,10,$ A ,, $ A,$ A,$ A,$ A)

对于TBCDField来说是相同的:

(14,32768,0,0,10,10,10,1.4012984643e-44,49406564584e-323,True,10,0.001,4.9406564584e-323 ,, $ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A,$ A'',$ A,$ A,$ A,$ A,$ A,#10,10 ,10,10,10,$ A ,, $ A,$ A,$ A,$ A)

foo值为10,条形值为-10。

这是一个错误吗?
有一个WorkAround?
这是固定的?

我使用Microsoft OLEDB提供程序进行Oracle和Oracle Provider for OLEDB进行了测试。 所有测试都是使用Delphi 6完成的。

1 个答案:

答案 0 :(得分:0)

我不知道我是否理解正确,但请尝试这样:

select cast(replace(-10,'-','') as number(9)) foo, -10 bar 
  from dual;