2011-01-12 3 views
11

Я отобразил объекты сущности Entity. Каждая таблица в SQL Server 2008 содержит столбец Timestamp, который отображается как массив байтов. Длина массива всегда 8.Как сравнить временную метку SQL в .NET?

Теперь мне нужно сравнить значения timestamp в .NET. У меня есть два решения, но я не знаю, какой из них лучше?

  • Сравните это как с массивами. Когда первая пара байтов отличается от другого, возвращает false.
  • Преобразование байт массива в длину, сравнить длинные.

Какое решение лучше? Или есть другое решение?

ответ

11

Мы делаем это, сравнивая их как массивы байтов. Прекрасно работает для нас.

9

Тип данных временной метки MS SQL Server семантически эквивалентен двоичному (8) (если не является нулевым) или varbinary (8) (если значение NULL). Ergo, сравните их как массивы байтов.

Не говоря уже о накладных расходах, связанных с преобразованием в длинный. Вы можете написать какой-то небезопасный код, чтобы получить адрес массивов байтов, отбросить их до длинных указателей и разыскать их в longs, НО для этого безопасно означает закрепление их в памяти и плот уродливого кода, чтобы сделать что-то существенно простое (и, возможно, не быстрее, чем с помощью BitConverter).

Самый быстрый способ сделать это, если производительность действительно так критично, самый быстрый способ будет делать сравнение с помощью функции стандартного C библиотеки memcmp() с помощью 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 очень cool –

+0

Jest a sold-school C programmer B ^) –

+0

@ Николас +1 это очень приятно, но я хотел бы избежать небезопасного кода. –

Смежные вопросы