Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS сравнение System.Byte[] в скрипте  [new]
tred_tred
Member

Откуда:
Сообщений: 32
Добрый день.

Не совсем уверен, что в нужном разделе пишу. Вопрос , наверно больше по C#, чем по SSIS.


Возникла следующая проблема, которая никак не поддается.

Из источника тащу данные тип binary(16).
Соответственно в SSIS в OLE DB Source в Preview определяется как System.Byte[]

Дальше в Script component надо сравнить величины подобного типа.

Делаю так

  
Объявляю переменные 
System.Byte[] x = new byte[16];
System.Byte[] y = new byte[16];
  
  


    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
 
        y=Row.column             // column - это столбец из которого тащу данные.
                                         // данные там типа  0x91200019BB2BE84811WC7BA1689FB888

        
           if (x.Equals(y))       // здесь сравниваю значения
        {
           ...
        }
        else
        {
            ....
        }

        x = Row.column;
      
    }



Получается так что выражение x.Equals(y) всегда дает False,
Даже кода там точно равные значения (0x91200019BB2BE84811WC7BA1689FB888=0x91200019BB2BE84811WC7BA1689FB888)

В чем ошибка?
И как эти значения правильно сравнивать.
24 сен 13, 18:33    [14879255]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
побайтно
Guest
не буду утверждать, лучше действительно спросить в соответствующей ветки, но в свое время удалось решить эту задачу только сравнением побайтно, в цикле. В принципе ч/з BitConverter можно привести к строке, но не факт что конвертация + сравнение строк будут быстрее.
24 сен 13, 18:37    [14879280]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Попробуйте перед script task добавить задачу Derived Column и преобразуйте ваш столбец в (DT_BYTES, 16)
24 сен 13, 18:52    [14879366]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
tred_tred
Получается так что выражение x.Equals(y) всегда дает False,
Естественно, ведь Equals сравнивает 2 указателя на объекты.

То есть если было бы написано
y = Row.column;
x = y;
то x.Equals(y) выдал бы True

Наверное, только побайтово.
24 сен 13, 22:38    [14879988]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
alexeyvg
Наверное, только побайтово.
Разве что link использовать.

Например, если порядок байтов неважен, то можно написать:
if (x.Intersect(y).Count() == x.Count())
{
    Console.WriteLine("равны");
}
else
{
    Console.WriteLine("не равны");
}
24 сен 13, 22:52    [14880035]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
alexeyvg
Разве что link использовать.
А, вот, нашёл.
if (x.SequenceEqual(y))

Впрочем, применение зависит от версии. Это вроде из .NET 4, наверное, можно использовать в SSIS от 2012
24 сен 13, 23:00    [14880063]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34723
Блог
http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net
24 сен 13, 23:13    [14880094]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
tred_tred
Member

Откуда:
Сообщений: 32
Remind
Попробуйте перед script task добавить задачу Derived Column и преобразуйте ваш столбец в (DT_BYTES, 16)


Так не помогло.

Функцию SequenceEqual() использовать , видимо версия не позволяет.

Сделал как написано в статье по ссылке.

Создал метод сравнения по-байтово

и там сравнивал

static bool ByteArrayCompare(byte[] a1, byte[] a2) 
{
  if(a1.Length!=a2.Length)
    return false;

  for(int i=0; i<a1.Length; i++)
    if(a1[i]!=a2[i])
      return false;

  return true;
}


System.Byte[] x = new System.Byte[32];
System.Byte[] y = new System.Byte[32];

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
 
        y=Row.column             
        
           if (ByteArrayCompare(x,y))      
        {
           ...
        }
        else
        {
            ....
        }

        x = Row.column;
      
    }




Работает достаточно быстро.
25 сен 13, 13:23    [14882074]     Ответить | Цитировать Сообщить модератору
 Re: SSIS сравнение System.Byte[] в скрипте  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
tred_tred
Функцию SequenceEqual() использовать , видимо версия не позволяет.

Сделал как написано в статье по ссылке.

Создал метод сравнения по-байтово
Если волнует скорость, то самая быстрая версия с memcmp, думаю, быстрее чем SequenceEqual и тем более сравнения побайтово в цикле.

Побайтовый метод медленный, не зря там народ извратился, приведя байтовый массив к массиву long :-)
25 сен 13, 13:36    [14882171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить