Как преобразовать двоичную строку обратно в байт в CSharp. Шестнадцатеричный номер, созданный SQL Server 2012 Varbinary(8)

Я пытаюсь преобразовать число String Hex обратно в Byte() в CSharp, и я просто не могу этого сделать!

Эти двоичные числа хранятся в столбце varBinary(8) внутри Sql Server 2012. Пример формата: 0x000000003B654362.

У меня нет проблем с получением их из базы данных и превращением в строку. Но когда я хочу запросить базу данных, используя этот шестнадцатеричный номер в качестве ключа, я хочу вернуть строку обратно в тип cSharp Byte. Я получаю сообщение об ошибке «Входная строка имеет неверный формат» каждый раз, когда пытаюсь использовать Convert.ToByte.

Сами шестнадцатеричные числа были созданы внутри запроса tsql внутри Sql Server следующим образом.

введите здесь описание изображения

Какую разновидность Convert.ToByte мне нужно использовать, чтобы превратить шестнадцатеричную строку обратно в байт, чтобы я мог использовать ее в качестве параметра запроса типа varBinary(8), чтобы использовать ее в качестве ключа при извлечении из базы данных. ? Я не уверен, какой тип кодировки SQL Server 2012 использует для создания этих шестнадцатеричных чисел, поскольку они создаются в sql, а не в cSharp. Спасибо, что посмотрели.

@Марк Г

Я попытался запросить базу данных, используя байт []. requestNbr - это мой шестнадцатеричный номер в виде строки, которую я пробовал System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding(); Byte[] bytes = кодировка.GetBytes(requestNbr); Затем я также попробовал UTF8, UTF32 и ASCIIEncoding.

Все с cmd.Parameters.Add("@requestNbr", SqlDbType.VarBinary).Value = bytes;

Ни один из них не дает мне никаких результатов из базы данных. Тем не менее, когда я перехожу к хранимой процедуре и просто устанавливаю для параметра @requestNbr varBinary(8) значение HexNumber, он возвращает результаты.

Параметр varBinary sql

Фильтр «Где»

Результаты, которые я должен получить, когда я передаю свой байт [], но всегда не возвращает никаких результатов.


person drzounds    schedule 23.11.2013    source источник


Ответы (2)


varbinary обрабатываются как необработанные данные. Вам никогда не нужно рассматривать его как шестнадцатеричный или беспокоиться о форматах. Вы просто используете параметр со значением byte[] (для связи с базой данных) или читаете значения как byte[] (для чтения из базы данных в С#).

Интересно, самая большая проблема здесь заключается в использовании конкатенации, а не параметров.

person Marc Gravell    schedule 23.11.2013
comment
Итак, как мне передать шестнадцатеричное число формата 0x000000003B654362, которое в настоящее время является строкой, в хранимую процедуру, которая ожидает, что это будет varBinary? SqlCommand cmd = новый SqlCommand (storedproc, conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(@requestNbr, SqlDbType.VarChar).Value = requestNbr; - person drzounds; 24.11.2013
comment
@drzounds, во-первых, прекратите использовать строки в этом сценарии. Только в С# и С# преобразуйте этот шестнадцатеричный код в байт []. Затем добавьте параметр с этим значением byte[]. - person Marc Gravell; 24.11.2013

Решение:

В конце концов мне просто пришлось отказаться от попыток преобразовать шестнадцатеричную строку в байт [].

Теперь я передаю саму шестнадцатеричную строку как NVarChar(max) и изменил фильтр WHERE на

ГДЕ ПРЕОБРАЗОВАТЬ (VARCHAR (1000), RequestNbr, 1) = @requestNbr

Изменение проблемного столбца varBinary(8) на строку, которая работала для фильтра.

person drzounds    schedule 23.11.2013