You are not logged in.
Hi,
I'm having a problem reading Boolean fields from a Jet table. They are always ending up with the value False, even when the value recorded in the table is True.
It seems to work ok when using ISQLDBRows with .Step, and it seems to work ok when using FetchAllAsJSON, both of which give a value of -1 for True, and 0 for False, as expected.
But when I try to access the data using the ORM with .CreateAndFillPrepare and .FillOne, the Boolean fields in my TSQLRecord descendant type always get the value False.
I think that I've tracked it down to the following routine, but I'm unsure how to fix it without breaking other things....
procedure TSQLPropInfoRTTIEnum.SetValue(Instance: TObject; Value: PUTF8Char; wasString: boolean);
var i,err: integer;
begin
if Value=nil then
i := 0 else begin
i := GetInteger(Value,err);
if err<>0 then // we allow a value stated as text
i := fEnumType^.GetEnumNameValue(Value); // -> convert into integer
if cardinal(i)>cardinal(fEnumType^.MaxValue) then
i := 0; // only set a valid value
end;
SetOrdProp(Instance,pointer(fPropInfo),i);
end;
In particular the following line...
if cardinal(i)>cardinal(fEnumType^.MaxValue) then
i := 0; // only set a valid value
When the Boolean is True, the value of i is -1, which passes the test (because of the typecast to cardinal, and fEnumType^.MaxValue = 1) and thus sets the value of i to 0.
I hope someone else knows enough about this area of the code to suggest a safe fix.
Offline
You are right.
The current implementation was confused by the boolean kind of variable.
I've fixed and enhanced boolean values parsing from JSON content.
Now "Yes" will be identified as true (in addition to "true").
See http://synopse.info/fossil/info/9692746f12
Thanks for the feedback.
Offline
Thanks ab.
That works well.
Offline