Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server varbinary bigint con valori BitConverter.ToInt64 sono diversi

Trasmissione da varbinary a bigint (e viceversa) usa l'ordine dei byte di rete (big-endian).BitConverter utilizza l'endian-ness della macchina su cui viene eseguito (little-endian per x86 e x64).

Quindi BitConverter.GetBytes eseguito su -8588797048854775808 (0x88CE7696E7167800) è {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} e cast su {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} è 0x0088E91869893177 =38536887891734903.

La cosa più ovvia da fare è innanzitutto memorizzare numeri interi a 64 bit come interi a 64 bit.

Se hai davvero bisogno di eseguire questa conversione, allora:

var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))

Scambia i byte, pur essendo portatile in quanto non scambia i byte se eseguito su una macchina big-endian.

In alternativa, se non vuoi utilizzare lo spazio dei nomi System.Net per qualche motivo, o se vuoi essere estensibile a tipi diversi dai tre IPAddress.HostToNetworkOrder maniglie, usa:

var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
  Array.Reverse(savedValue);