Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
побайтно
Guest |
не буду утверждать, лучше действительно спросить в соответствующей ветки, но в свое время удалось решить эту задачу только сравнением побайтно, в цикле. В принципе ч/з BitConverter можно привести к строке, но не факт что конвертация + сравнение строк будут быстрее. |
24 сен 13, 18:37 [14879280] Ответить | Цитировать Сообщить модератору |
Remind Member Откуда: UK Сообщений: 523 |
Попробуйте перед script task добавить задачу Derived Column и преобразуйте ваш столбец в (DT_BYTES, 16) |
24 сен 13, 18:52 [14879366] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
То есть если было бы написано y = Row.column; x = y;то x.Equals(y) выдал бы True Наверное, только побайтово. |
||
24 сен 13, 22:38 [14879988] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Например, если порядок байтов неважен, то можно написать: if (x.Intersect(y).Count() == x.Count()) { Console.WriteLine("равны"); } else { Console.WriteLine("не равны"); } |
||
24 сен 13, 22:52 [14880035] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
if (x.SequenceEqual(y))
Впрочем, применение зависит от версии. Это вроде из .NET 4, наверное, можно использовать в SSIS от 2012 |
||
24 сен 13, 23:00 [14880063] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34723 Блог |
http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net |
24 сен 13, 23:13 [14880094] Ответить | Цитировать Сообщить модератору |
tred_tred Member Откуда: Сообщений: 32 |
Так не помогло. Функцию 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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Побайтовый метод медленный, не зря там народ извратился, приведя байтовый массив к массиву long :-) |
||
25 сен 13, 13:36 [14882171] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |