Как сравнить отметку времени SQL в .NET? - PullRequest
11 голосов
/ 12 января 2011

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 12 января 2011

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

9 голосов
/ 13 января 2011

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

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

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

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...