Как извлечь varbinary из строковых данных? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь написать приложение, в котором у меня есть таблица, которую я экспортирую в текстовый файл с разделителями табуляции. У меня есть столбец, который имеет тип varbinary (max) в таблице.

Я конвертирую его в varchar, который просто удаляет 0x из строки varbinary и сохраняет его в файле. Я запускаю этот запрос выбора с помощью sqlcmd в командной строке и сохраняю результат в файле.

SELECT AuthorizationId
   ,Name 
   ,CONVERT(VARCHAR(85), [ownersid], 2) AS ownersid
   ,[ownerSidWhereDefined]
   ,[AuthorizationType]
   ,ISNULL(CONVERT(NVARCHAR(10), [ValidFrom]), '') AS [ValidFrom]
   ,ISNULL(CONVERT(NVARCHAR(10), [ValidTo]), '') AS [ValidTo]
from Authorization

Пример строки - 72 Администратор 01050000000000051500000026761E2FEB25792C07E53B2B24060000 4 1

После завершения экспорта я пишуприложение C #, которое будет читать этот файл и выполнять sqlbulkcopy для вставки данных в таблицу в другой базе данных. На данный момент файл содержит правильное значение, которое, как я ожидаю, будет из таблицы.

Это код, который я запускаю для того же -

  public class AuthorizationsFmt
    {
        public string AuthorizationId;
        public string ownerSid;
        public byte[] ownerSidWhereDefined;
        public string Name;
        public string AuthorizationType;
        public string ValidFrom;
        public string ValidTo;       
     }
   IEnumerable<AuthorizationsFmt> FileData = from l in 
                   File.ReadLines(file)
                    let x = l.Split( '\t')                        
                    select new AuthorizationsFmt()
                    {
                        AuthorizationId = x.ElementAt(0),
                        Name = x.ElementAt(1),
                        ownerSid = Encoding.UTF8.GetBytes(x.ElementAt(2)),
                        ownerSidWhereDefined = x.ElementAt(3),
                        AuthorizationType = x.ElementAt(4),
                        ValidFrom = x.ElementAt(5),
                        ValidTo = x.ElementAt(6)
                    };
        return FileData;

После этого я преобразую Ienumerable в datatable, использую sqlbulkcopy для вставки данных в таблицу. Проблема заключается в том, что при выполнении sqlbulkcopy преобразование между строкой в ​​varbinary является неправильным.

Исходное значение из файла теперь становится '0x3078303130353030303030303030303035313530303030303032363736314532464542323537393243303235373932433032353739324330324530303030303030303030303032323232323232323230Кроме того, это значение одинаково для всех записей в таблице.

1 Ответ

0 голосов
/ 07 ноября 2019

Это то, что я использовал для преобразования в byteArray, а затем вставил в базу данных

  public static byte[] ByteArrayFromHexaString(string hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...