Einzelnen Beitrag anzeigen

TimWu

Registriert seit: 27. Okt 2016
16 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes

  Alt 10. Jun 2020, 11:29
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
  Mit Zitat antworten Zitat