2011-01-12 40 views
11

Tôi đã ánh xạ thực thể khung thực thể. Mỗi bảng trong SQL Server 2008 chứa cột Dấu thời gian được ánh xạ dưới dạng mảng byte. Độ dài của mảng luôn là 8.Làm thế nào để so sánh SQL dấu thời gian trong .NET?

Bây giờ tôi cần so sánh giá trị dấu thời gian trong .NET. Tôi đi kèm với hai giải pháp nhưng tôi không biết cái nào tốt hơn?

  • So sánh nó như mảng. Khi cặp byte đầu tiên trả về false khác nhau.
  • Chuyển đổi mảng byte thành dài, so sánh độ dài.

Giải pháp nào tốt hơn? Hoặc có giải pháp nào khác không?

Trả lời

11

Chúng tôi làm điều đó bằng cách so sánh chúng dưới dạng mảng byte. Làm việc tốt cho chúng tôi.

9

Loại dữ liệu dấu thời gian của MS SQL Server tương đương ngữ nghĩa với nhị phân (8) (nếu không có giá trị null) hoặc varbinary (8) (nếu nullable). Ergo, so sánh chúng như mảng byte.

Chưa kể đến chi phí liên quan đến việc chuyển đổi thành dài. Bạn có thể viết một số mã không an toàn để lấy địa chỉ của các mảng byte, đưa chúng đến các con trỏ dài và dereference chúng thành longs, NHƯNG để làm điều đó một cách an toàn có nghĩa là ghim chúng vào bộ nhớ và một loạt các mã xấu xí để làm điều gì đó đơn giản (và có lẽ không nhanh hơn sử dụng BitConverter).

Cách nhanh nhất để làm điều đó, nếu hiệu suất là thực sự quan trọng, cách nhanh nhất sẽ được để làm việc so sánh sử dụng memcmp() chức năng tiêu chuẩn C thư viện thông qua P/Invoke:

using System; 
using System.Runtime.InteropServices; 

namespace TestDrive 
{ 
    class Program 
    { 
     static void Main() 
     { 
      byte[] a = { 1,2,3,4,5,6,7,8} ; 
      byte[] b = { 1,2,3,4,5,0,7,8} ; 
      byte[] c = { 1,2,3,4,5,6,7,8} ; 
      bool isMatch ; 

      isMatch = TimestampCompare(a , b) ; // returns false 
      isMatch = TimestampCompare(a , c) ; // returns true 

      return ; 
     } 

     [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)] 
     static extern int memcmp(byte[] x , byte[] y , UIntPtr count) ; 

     static unsafe bool TimestampCompare(byte[] x , byte[] y) 
     { 
      const int LEN = 8 ; 
      UIntPtr cnt = new UIntPtr((uint) LEN) ; 

      // check for reference equality 
      if (x == y) return true ; 

      if (x == null || x.Length != LEN || y == null || y.Length != LEN) 
      { 
       throw new ArgumentException() ; 
      } 

      return (memcmp( x , y , cnt) == 0 ? true : false) ; 
     } 

    } 

} 
+0

@Nicholas rất cool –

+0

Jest một lập trình viên bán trường C ^) –

+0

@Nicholas +1 nó rất hay nhưng tôi muốn tránh mã không an toàn. –

Các vấn đề liên quan