Ich speichere meinen long
-Wert in einer SQL Server-Tabelle als varbinary(max)
:
Jetzt muss ich mit diesem Wert in T-SQL-Abfrage arbeiten, aber wenn ich versuche, Wert zu erhalten:
%Vor% Gibt einen anderen Zahlenwert zurück. Zum Beispiel, wenn ich -8588797048854775808
in .NET gespeichert habe, bekomme ich in T-SQL 33802181122903688
Bitte sagen Sie mir, was ist das Problem? Haben Sie eine Lösung?
Casting von varbinary
bis bigint
(und zurück) verwendet die Netzwerk-Byte-Reihenfolge (big-endian).
BitConverter
verwendet die endian-ness der Maschine, auf der es ausgeführt wird (little-endian für x86 und x64).
Daher ist BitConverter.GetBytes
run auf -8588797048854775808 (0x88CE7696E7167800) {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} und cast
auf {0x00,0x88,0xE9,0x18,0x69,0x89 , 0x31,0x77} ist 0x0088E91869893177 = 38536887891734903.
Es ist naheliegend, 64-Bit-Ganzzahlen als 64-Bit-Ganzzahlen zu speichern.
Wenn Sie diese Konvertierung wirklich durchführen müssen, dann:
%Vor%Tauscht die Bytes aus, während es auch portierbar ist, da es die Bytes nicht tauscht, wenn es auf einer Big-Endian-Maschine ausgeführt wird.
Wenn Sie den System.Net-Namespace aus irgendeinem Grund nicht verwenden möchten oder wenn Sie auf andere Typen als die drei IPAddress.HostToNetworkOrder
-Handeles erweiterbar sein möchten, verwenden Sie alternativ:
Tags und Links sql-server tsql bigint