SQL Server varbinary bigint mit BitConverter.ToInt64 Werte sind unterschiedlich

8

Ich speichere meinen long -Wert in einer SQL Server-Tabelle als varbinary(max) :

%Vor%

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?

    
Maybe 11.12.2011, 20:09
quelle

1 Antwort

11

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:

%Vor%     
Jon Hanna 11.12.2011, 20:35
quelle

Tags und Links