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

konvertere sql server rowversion til long eller ulong?

Det betyder noget. Du ønsker, at din sammenligning skal have samme resultat som SQL Servers sammenligning. SQL Server bruger usignerede sammenligninger på binære typer:

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

Hvis du gør det samme med long som er underskrevet, 0xFFFFFFFFFFFFFFFF repræsenterer -1 . Det betyder, at din sammenligning vil være forkert; det vil ikke matche med den samme sammenligning udført i SQL Server.

Hvad du helt sikkert ønsker, er at bruge ulong hvor 0xFFFFFFFFFFFFFFFF er ulong.MaxValue .

Endianness er også vigtigt

Derudover, som Mark påpegede, BitConverter.GetUInt64 konverterer ikke korrekt. Mark har ikke helt ret - BitConverter er enten big-endian eller little-endian afhængigt af det system, den kører på. Du kan se dette selv . Også selv om BitConverter altid var lille endian, Array.Reverse er mindre effektiv med en heap-allokering og byte-for-byte-kopiering. BitConverter er bare ikke semantisk eller praktisk det rigtige værktøj til jobbet.

Dette er, hvad du ønsker:

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];
}

Den reneste løsning

Opdater :Hvis du bruger .NET Core 2.1 eller nyere (eller .NET Standard 2.1), kan du bruge BinaryPrimitives.ReadUInt64BigEndian hvilket er en perfekt pasform.

På .NET Framework er her den løsning, jeg bruger:Timestamp.cs . Dybest set når du caster til Timestamp , du kan ikke gå galt.



  1. Opret bruger fra strengvariabler i en PL/SQL-blok

  2. Hvordan kan jeg nulstille en MySQL AutoIncrement ved hjælp af en MAX-værdi fra en anden tabel?

  3. Korrekt installationsrækkefølge til Visual Studio 2010 med SQL Server 2008 og Office 2007?

  4. dublerede resultater