问题描述
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.