Wrong values returned for Numeric(12,3) fields
Posted: Wed 21 Mar 2012 06:47
Delphi: XE2
DBXIDA: 3.1.2
Firebird: 2.5
Summary: With OptimizedNumerics=True, EnableBCD=True, and EnableLargeint=True, values in NUMERIC(12,3) fields come back 10 times larger than the value stored. This is not observed on NUMERIC(12,2) or NUMERIC(12,4) fields.
Steps:
Create a dialect 3 database and make the following domains, table and data.
CREATE DOMAIN T_N12_2 AS NUMERIC(12,2);
CREATE DOMAIN T_N12_3 AS NUMERIC(12,3);
CREATE DOMAIN T_N12_4 AS NUMERIC(12,4);
create table test (ID BigInt, Val1 T_N12_2, Val2 T_N12_3, Val3 T_N12_4);
insert into test (ID, Val1, Val2, Val3) values (1, 50, 50, 50);
In delphi, create a TSQLConnection, TSimpleDataSet, TDataSource and TDBGrid.
Write some code:
SQLCon.Close;
SQLCon.DriverName := DbxIdaDriverLoader.sBuiltinDriverName;
SQLCon.LoginPrompt := False;
SQLCon.Params.Clear;
SQLCon.Params.Add('User_Name=IC');
SQLCon.Params.Add('Password=IC');
SQLCon.Params.Add('Database=' + ExtractFilePath(Application.EXEName) + 'Test.fdb');
SQLCon.Params.Add('SQLDialect=3');
SQLCon.Params.Add('BlobSize=-1');
SQLCon.Params.Add('DevartInterBase TransIsolation=ReadCommited');
SQLCon.Params.Add('WaitOnLocks=True');
SQLCon.Params.Add('OptimizedNumerics=True');
SQLCon.Params.Add('EnableBCD=True');
SQLCon.Params.Add('EnableLargeint=True');
SQLCon.Params.Add('LongStrings=True');
SQLCon.Params.Add('UseQuoteChar=False');
SQLCon.Params.Add('FetchAll=False');
SQLCon.Params.Add('CharLength=0');
SQLCon.Params.Add('TrimFixedChar=True');
SQLCon.Params.Add('UseUnicode=True');
SQLCon.Params.Add('Charset=ASCII');
SQLCon.Params.Add('VendorLib=' + ExtractFilePath(Application.EXEName) + 'fbembed.dll');
SQLCon.Open;
Qry1.Open;
Now the grid will show the data, with Val1 being 50, Val being 50 and Val2 being 500 (incorrect).
Changing EnableBCD to false changes Val2 to 50, or changing OptimizeNumerics to False changes Val2 to 50.
DBXIDA: 3.1.2
Firebird: 2.5
Summary: With OptimizedNumerics=True, EnableBCD=True, and EnableLargeint=True, values in NUMERIC(12,3) fields come back 10 times larger than the value stored. This is not observed on NUMERIC(12,2) or NUMERIC(12,4) fields.
Steps:
Create a dialect 3 database and make the following domains, table and data.
CREATE DOMAIN T_N12_2 AS NUMERIC(12,2);
CREATE DOMAIN T_N12_3 AS NUMERIC(12,3);
CREATE DOMAIN T_N12_4 AS NUMERIC(12,4);
create table test (ID BigInt, Val1 T_N12_2, Val2 T_N12_3, Val3 T_N12_4);
insert into test (ID, Val1, Val2, Val3) values (1, 50, 50, 50);
In delphi, create a TSQLConnection, TSimpleDataSet, TDataSource and TDBGrid.
Write some code:
SQLCon.Close;
SQLCon.DriverName := DbxIdaDriverLoader.sBuiltinDriverName;
SQLCon.LoginPrompt := False;
SQLCon.Params.Clear;
SQLCon.Params.Add('User_Name=IC');
SQLCon.Params.Add('Password=IC');
SQLCon.Params.Add('Database=' + ExtractFilePath(Application.EXEName) + 'Test.fdb');
SQLCon.Params.Add('SQLDialect=3');
SQLCon.Params.Add('BlobSize=-1');
SQLCon.Params.Add('DevartInterBase TransIsolation=ReadCommited');
SQLCon.Params.Add('WaitOnLocks=True');
SQLCon.Params.Add('OptimizedNumerics=True');
SQLCon.Params.Add('EnableBCD=True');
SQLCon.Params.Add('EnableLargeint=True');
SQLCon.Params.Add('LongStrings=True');
SQLCon.Params.Add('UseQuoteChar=False');
SQLCon.Params.Add('FetchAll=False');
SQLCon.Params.Add('CharLength=0');
SQLCon.Params.Add('TrimFixedChar=True');
SQLCon.Params.Add('UseUnicode=True');
SQLCon.Params.Add('Charset=ASCII');
SQLCon.Params.Add('VendorLib=' + ExtractFilePath(Application.EXEName) + 'fbembed.dll');
SQLCon.Open;
Qry1.Open;
Now the grid will show the data, with Val1 being 50, Val being 50 and Val2 being 500 (incorrect).
Changing EnableBCD to false changes Val2 to 50, or changing OptimizeNumerics to False changes Val2 to 50.