sql >> Databasteknik >  >> RDS >> Sqlserver

konvertera sql server rowversion till long eller ulong?

Det spelar roll. Du vill att din jämförelse ska få samma resultat som SQL Servers jämförelse. SQL Server använder osignerade jämförelser på binära typer:

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

Om du gör samma sak med long som är signerad, 0xFFFFFFFFFFFFFFFF representerar -1 . Det betyder att din jämförelse blir felaktig; det kommer inte att matcha med samma jämförelse som gjorts i SQL Server.

Vad du definitivt vill är att använda ulong där 0xFFFFFFFFFFFFFFFF är ulong.MaxValue .

Endianness är också viktigt

Dessutom, som Mark påpekade, BitConverter.GetUInt64 konverterar inte ordentligt. Mark har inte helt rätt - BitConverter är antingen big-endian eller little-endian beroende på vilket system den körs på. Du kan se detta själv . Också, även om BitConverter alltid var little-endian, Array.Reverse är mindre presterande med en heap-allokering och byte-för-byte-kopiering. BitConverter är helt enkelt inte semantiskt eller praktiskt det rätta verktyget för jobbet.

Det här är vad du vill:

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 renaste lösningen

Uppdatera :Om du använder .NET Core 2.1 eller senare (eller .NET Standard 2.1) kan du använda BinaryPrimitives.ReadUInt64BigEndian vilket är en perfekt passform.

På .NET Framework, här är lösningen jag använder:Timestamp.cs . I princip när du castar till Timestamp , du kan inte gå fel.



  1. Konvertering från ANSI till Oracle Join Syntax

  2. Kan flera primära nycklar finnas på ett enda bord?

  3. JDBC COPY med ant

  4. Hur anger man @lock timeout i vår data jpa-fråga?