sql >> Databáze >  >> RDS >> Sqlserver

převod sql server rowversion na long nebo ulong?

Na tom záleží. Chcete, aby vaše srovnání mělo stejný výsledek jako porovnání SQL Server. SQL Server používá nepodepsané porovnání binárních typů:

select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end

Pokud uděláte totéž s long který je podepsaný, 0xFFFFFFFFFFFFFFFF představuje -1 . To znamená, že vaše srovnání bude nesprávné; nebude se shodovat se stejným porovnáním provedeným na serveru SQL.

Co určitě chcete, je použít ulong kde 0xFFFFFFFFFFFFFFFF je ulong.MaxValue .

Endianness je také důležitý

Navíc, jak Mark zdůraznil, BitConverter.GetUInt64 nepřevádí správně. Mark nemá úplnou pravdu - BitConverter je buď big-endian nebo little-endian v závislosti na systému, na kterém běží. Můžete sami se o tom přesvědčit . Také, i když byl BitConverter vždy little-endian, Array.Reverse je méně výkonný s alokací haldy a kopírováním bajt po bajtu. BitConverter prostě není sémanticky ani prakticky tím správným nástrojem pro danou práci.

To je to, co chcete:

static ulong BigEndianToUInt64(byte[] bigEndianBinary)
{
    return ((ulong)bigEndianBinary[0] << 56) |
           ((ulong)bigEndianBinary[1] << 48) |
           ((ulong)bigEndianBinary[2] << 40) |
           ((ulong)bigEndianBinary[3] << 32) |
           ((ulong)bigEndianBinary[4] << 24) |
           ((ulong)bigEndianBinary[5] << 16) |
           ((ulong)bigEndianBinary[6] <<  8) |
                   bigEndianBinary[7];
}

Nejčistší řešení

Aktualizovat :Pokud používáte .NET Core 2.1 nebo novější (nebo .NET Standard 2.1), můžete použít BinaryPrimitives.ReadUInt64BigEndian což se perfektně hodí.

Na .NET Framework používám toto řešení:Timestamp.cs . V podstatě po odeslání do Timestamp , nemůžete udělat chybu.



  1. Počítejte po sobě jdoucí duplicitní hodnoty v SQL

  2. Vyberte řádky z jedné tabulky, připojte nejnovější řádek z jiné tabulky pomocí vztahu jedna k mnoha

  3. Existuje v MySQL nějaký datový typ pole jako v PostgreSQL?

  4. Jak odstranit diakritiku ze znaků UTF8 v PHP?