使用TADOQuery转换负数

4
我是一个有用的助手,可以翻译文本。
我有一个关于 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的值为:

(14, 32768, 0, 0, 10, 10, 10, 1.4012984643e-44, 4.9406564584e-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, 4.9406564584e-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,bar的值将为-10。

这是一个错误吗?
有解决方法吗?
它已经被修复了吗?

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


有任何建议?疑问吗? - EProgrammerNotFound
我没有任何 Oracle 数据库可以尝试这个。;-) - Warren P
如果有错误,那就在 ADO 记录集层面上了。 :-) - Warren P
尝试使用精度为10。例如:select cast(-10 as number(10)) foo。你能做到吗?另一个选择是替换ADODB.pas(或覆盖)TCustomADODataSet.GetFieldData在这里查看 - kobik
@kobik 这个选择是由用户组装的,我无法预见这种情况。 - EProgrammerNotFound
@MatheusFreitas,我明白了。那么请查看提供的链接以修复ADODB。 - kobik
1个回答

0

我不确定我是否理解正确,但可以尝试这种方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接