ADO FieldByName('X').AsCurrency 返回 0

问题描述

Delphi XE8 和 sqlServer 2017。

我有一个查询 (TADOQuery) 连接到 sqlServer 数据库。打开数据集 (TADOQuery.Open) 后,如果我调用 TADOQuery.FieldByName('X').AsCurrency,它返回 0,但如果我调用 TADOQuery.FieldByName('X').AsFloat,它返回 12.65(正确值)。查看表中的特定字段,类型为numeric(18,4)。怎么了?

代码运行其他

with TADOQuery1 do
begin
  sql.Clear;
  sql.Add('select X from Table1');
  Open;
  if FieldByName('X').AsCurrency > 0 then  // <- Here is the problem
    do something
  else
    do otherthing;
end;

代码运行东西

with TADOQuery1 do
begin
  sql.Clear;
  sql.Add('select X from Table1');
  Open;
  if FieldByName('X').AsFloat > 0 then  // <- Here is the problem
    do something
  else
    do otherthing;
end;

解决方法

无法重现此行为。

这里是一个 MRE,金额是表 Tbl_test 中的数字(18,4):

program SO68004040;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  ActiveX,AdoDb,System.SysUtils;


var
  DbConn : TADOConnection;
  Qry    : TADOQuery;

begin
  Coinitialize(nil);
  try
    DbConn := TADOConnection.Create(nil);
    Qry := TADOQuery.Create(nil);
    try
     Qry.Connection := DbConn;
     DbConn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=TestCustomer;Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI; ';
     DbConn.Connected := True;
     Qry.SQL.Text := 'SELECT * FROM Tbl_test';
     Qry.Open;
     while not Qry.Eof do
      begin
       Writeln(Format('AsCurrency: %.4f',[Qry.FieldByName('amount').AsCurrency]));
       Writeln(Format('AsFloat: %.4f',[Qry.FieldByName('amount').AsFloat]));
       Qry.Next;
      end;
    finally
     Qry.Free;
     DbConn.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName,': ',E.Message);
  end;
  CoUninitialize();
  Readln;
end.