Hallo Zusammen,
Wir haben die neue Delphi-Version 10.4 installiert. Als Datenbank-Schnittstelle verwenden wir noch zum größten Teil die
BDE, sind aber dabei diese nach und nach durch FireDAC auszutauschen. Eine komplette Umstellung wird allerdings noch ein paar Monate dauern.
Das Kompilieren klappte, allerdings trat beim Ausführen ein merkwürdiger Fehler in der
BDE auf. Beim Setzen eines Boolean-Fields in einer TTable auf "True" und anschließendem Post wird der folgende Fehler ausgegeben:
Code:
Erste Gelegenheit für
Exception bei $74E14402.
Exception-Klasse EDBEngineError mit Meldung
'Allgemeiner
SQL-Fehler
[Microsoft][
ODBC SQL Server Driver]Numerische Werte außerhalb des zulässigen Bereichs'.
Prozess ToolKit.exe (5716)
Wir vermuten nach einigem Debugging, dass der Fehler auf die Änderung des Kompilats der folgenden Funktion, in der
Unit "Data.DB", zurückgeführt werden kann.
Delphi-Quellcode:
procedure TBooleanField.SetAsBoolean(Value: Boolean);
var
B: WordBool;
//Dies ist ein usigned short
begin
if Value
then Word(B) := 1
else Word(B) := 0;
if FIOBuffer <>
nil then
TDBBitConverter.UnsafeFrom<WordBool>(B, FIOBuffer);
SetData(FIOBuffer);
end;
Hex-Code 10.3
Data.DB.pas.7568:
if Value
then Word(B) := 1
else Word(B) := 0;
006FDFA2 84D2 test
dl,
dl
006FDFA4 7406 jz $006fdfac
006FDFA6 66BA0100 mov dx,$0001
006FDFAA EB02 jmp $006fdfae
006FDFAC 33D2
xor edx,edx
Hex-Code 10.4
Data.DB.pas.7610:
if Value
then Word(B) := 1
else Word(B) := 0;
007124D2 84D2 test
dl,
dl
007124D4 7405 jz $007124db
007124D6 83CAFF
or edx,-$01
007124D9 EB02 jmp $007124dd
007124DB 33D2
xor edx,edx
Der Befehl "mov dx,$0001" wurde durch "or edx,-$01" ausgetauscht.
Vorher wurde also die "1" fix in die Variable geschrieben, nun wird diese mit "-1" verodert. "-1" entspricht beim Zweierkomplement "1111 1111". Da dies verodert wird steht in B in der neuen Version nicht mehr "0000 0001" sondern "1111 1111". Dies konnte auch beim Debugging eingesehen werden (1 wurde zu 65535).
Dies wird dann auch anschließend in den IOBuffer geschrieben. Hier steht dann nicht (1, 0, ...) sondern (255, 255, ...)
Dies ist unserer Meinung nach der Grund für den Fehler "Numerische Werte außerhalb des zulässigen Bereichs". Die
BDE scheint den IOBuffer nicht richtig auslesen zu können. Weiter Debuggen konnten wir hier aber auch nicht, da die
BDE-Funktionen in DLLs liegen.
Hat jemand eine Idee, wie wir dies korrigieren können?
Danke schonmal