Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Int64 spinnt oder ich. HILFE!!!! (https://www.delphipraxis.net/216144-int64-spinnt-oder-ich-hilfe.html)

Papaschlumpf73 5. Nov 2024 16:40

Datenbank: SQL-Server • Version: 2019 • Zugriff über: ADO

Int64 spinnt oder ich. HILFE!!!!
 
Eigentlich wollte ich nur IDs aus einer Datenbank übernehmen. Jetzt stellt sich raus, dass die alle falsch sind. Es ist auch egal, ob es eine SQL-Server-DB oder eine IBM-DB2-Datenbank ist. Die drei Zahlen im Beispiel sind identisch - nur nicht in der Ausgabe.
Delphi-Quellcode:
procedure TFMain.Button2Click(Sender: TObject);
var A, B: Int64; C: String;
begin
A:=-7978126718202166279;
B:=Int64(DM.ADOCon.Execute('SELECT CAST(-7978126718202166279 as bigint)').Fields[0].Value);
C:=VarToStr(DM.ADOCon.Execute('SELECT CAST(-7978126718202166279 as bigint)').Fields[0].Value);
Memo1.Lines.Append('A: '+A.ToString);
Memo1.Lines.Append('B: '+B.ToString);
Memo1.Lines.Append('C: '+C);
end;
Und hier das Ergebnis in Memo1 - seht euch mal die letzten Ziffern an:
A: -7978126718202166279
B: -7978126718202166272
C: -7978126718202166279

Sinspin 5. Nov 2024 17:03

AW: Int64 spinnt oder ich. HILFE!!!!
 
Wenn ich das richtig sehe dann haut nur B nicht hin.
Und da gibt es nur eine Option, rausbekommen was VarToStr anders macht als die Funktion Int64.

Als was, als welcher Typ, kommt "bigint" in die Variante die dann in Int64 convertiert wird ...?

Uwe Raabe 5. Nov 2024 17:06

AW: Int64 spinnt oder ich. HILFE!!!!
 
Hast du mal geprüft was das Feld für einen Delphi-Typ hat?

Papaschlumpf73 5. Nov 2024 17:07

AW: Int64 spinnt oder ich. HILFE!!!!
 
Wenn man die Int64()-Funktion weglässt, sieht es leider genauso aus:

B:=DM.ADOCon.Execute('SELECT CAST(-7978126718202166279 as bigint)').Fields[0].Value;

Papaschlumpf73 5. Nov 2024 17:13

AW: Int64 spinnt oder ich. HILFE!!!!
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1542882)
Hast du mal geprüft was das Feld für einen Delphi-Typ hat?

Delphi-Quellcode:
if DM.ADOCon.Execute('SELECT CAST(-7978126718202166279 as bigint)').Fields[0].Type_=adBigInt
then Memo1.Lines.Append('Treffer');
Der Feldtyp passt schon...

Sinspin 5. Nov 2024 17:56

AW: Int64 spinnt oder ich. HILFE!!!!
 
adBigInt = 20 = varInt64. Das passt. Der Varianten Converter scheint ja auch zu funktionieren.

Also muss man anstatt direkter Zuweisung, was zu einem internen Cast auf Int64 zu führen scheint, VarToStr nutzen um dann wieder in Int64 zu konvertieren.
Hast Du das mal probiert? Auch wenn es bescheuert ist:shock:.

Papaschlumpf73 5. Nov 2024 18:37

AW: Int64 spinnt oder ich. HILFE!!!!
 
Zitat:

Zitat von Sinspin (Beitrag 1542886)
adBigInt = 20 = varInt64. Das passt. Der Varianten Converter scheint ja auch zu funktionieren.
Also muss man anstatt direkter Zuweisung, was zu einem internen Cast auf Int64 zu führen scheint, VarToStr nutzen um dann wieder in Int64 zu konvertieren.
Hast Du das mal probiert? Auch wenn es bescheuert ist:shock:.

Das ist wirklich bescheuert - aber es funktioniert. Das ist doch kreuzgefährlich, wenn da so ein Murks passiert. :wall:
Delphi-Quellcode:
D:=StrToInt64(VarToStr(DM.ADOCon.Execute('SELECT CAST(-7978126718202166279 as bigint)').Fields[0].Value));

Uwe Raabe 5. Nov 2024 19:38

AW: Int64 spinnt oder ich. HILFE!!!!
 
Kann man denn im Debugger nicht sehen was passiert?

Sinspin 6. Nov 2024 07:54

AW: Int64 spinnt oder ich. HILFE!!!!
 
Ich habe nur Delphi 11 hier. Habe mich ein bisschen durch die Sourcen gegraben. Sieht so aus als wenn es 3 Methoden gibt mit denen intern umgewandelt wird. Interessant wäre es zu sehen was wirklich im fall des Fehlers genommen wird.
Aber, das ist eigentlich ein Fall für Emba, denn egal wie, es sollte immer der gleiche Wert rauskommen.

Papaschlumpf73 6. Nov 2024 09:32

AW: Int64 spinnt oder ich. HILFE!!!!
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1542889)
Kann man denn im Debugger nicht sehen was passiert?

In den letzten 30 Jahren habe ich noch nie einen Debugger benutzt. Da müsste ich mich erst mal reinfummeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz