Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

conversion de sql server rowversion en long ou ulong ?

C'est important. Vous voulez que votre comparaison ait le même résultat que la comparaison de SQL Server. SQL Server utilise des comparaisons non signées sur les types binaires :

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

Si vous faites la même chose avec long qui est signé, 0xFFFFFFFFFFFFFFFF représente -1 . Cela signifie que votre comparaison sera incorrecte ; il ne correspondra pas à la même comparaison effectuée dans SQL Server.

Ce que vous voulez vraiment, c'est utiliser ulong 0xFFFFFFFFFFFFFFFF est ulong.MaxValue .

L'endianité est également importante

De plus, comme Mark l'a souligné, BitConverter.GetUInt64 ne se convertit pas correctement. Mark n'a pas tout à fait raison - BitConverter est soit big-endian ou little-endian selon le système sur lequel il s'exécute. Vous pouvez voir cela par vous-même . De plus, même si BitConverter était toujours little-endian, Array.Reverse est moins performant avec une allocation de tas et une copie octet par octet. BitConverter n'est tout simplement pas sémantiquement ou pratiquement le bon outil pour le travail.

Voici ce que vous voulez :

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

La solution la plus propre

Mettre à jour :Si vous utilisez .NET Core 2.1 ou version ultérieure (ou .NET Standard 2.1), vous pouvez utiliser BinaryPrimitives.ReadUInt64BigEndian qui est un ajustement parfait.

Sur .NET Framework, voici la solution que j'utilise :Timestamp.cs . Fondamentalement, une fois que vous avez casté vers Timestamp , vous ne pouvez pas vous tromper.