Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

chuyển đổi rowversion máy chủ sql thành dài hay dài?

Nó quan trọng. Bạn muốn so sánh của mình có cùng kết quả với so sánh của SQL Server. SQL Server sử dụng so sánh không dấu trên các kiểu nhị phân:

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

Nếu bạn làm điều tương tự với long được ký, 0xFFFFFFFFFFFFFFFF đại diện cho -1 . Điều đó có nghĩa là so sánh của bạn sẽ không chính xác; nó sẽ không khớp với cùng một so sánh được thực hiện trong SQL Server.

Điều bạn chắc chắn muốn là sử dụng ulong ở đâu 0xFFFFFFFFFFFFFFFFulong.MaxValue .

Sự bền bỉ cũng rất quan trọng

Ngoài ra, như Mark đã chỉ ra, BitConverter.GetUInt64 chuyển đổi không đúng cách. Đánh dấu là không hoàn toàn đúng - BitConverter là big-endian hoặc little-endian tùy thuộc vào hệ thống mà nó đang chạy. Bạn có thể tự xem phần này . Ngoài ra, ngay cả khi BitConverter luôn là phần tử nhỏ, Array.Reverse kém hiệu quả hơn với phân bổ heap và sao chép từng byte. BitConverter về mặt ngữ nghĩa hay thực tế không phải là công cụ phù hợp cho công việc.

Đây là những gì bạn muốn:

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

Giải pháp sạch nhất

Cập nhật :Nếu bạn sử dụng .NET Core 2.1 trở lên (hoặc .NET Standard 2.1), bạn có thể sử dụng BinaryPrimitives.ReadUInt64BigEndian đó là một sự phù hợp hoàn hảo.

Trên .NET Framework, đây là giải pháp tôi sử dụng: Timestamp.cs . Về cơ bản khi bạn truyền đến Timestamp , bạn không thể sai.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các tính năng mới trong SQL Server 2017 (Công cụ cơ sở dữ liệu)

  2. Tham gia đến MAX bản ghi ngày trong nhóm

  3. Cách khắc phục “Câu lệnh EXECUTE không thành công vì mệnh đề WITH RESULT SETS của nó đã chỉ định 1 (các) tập kết quả…” trong SQL Server

  4. Tạo chế độ xem từ các bảng con có liên quan

  5. So sánh ngày của SQL Server chỉ dựa trên tháng và năm