2017-02-21 5 views
0

Мне было предложено сгенерировать скрипты для определенного набора операций (в основном вставки информации о продуктах для портала электронной торговли) и выполнить сгенерированный скрипт. Проблема, с которой я сталкиваюсь, заключается в том, что мы сохраняем все изображения в виде двоичных данных в таблице. Теперь, как я должен сценарировать запрос для этого, я получаю несоответствие типа, когда я пытался вставить массив байтов в форме строки. Это то, что я пробовал.генерация скрипта sql для вставки байтового массива

//imgbyte is the byte array containing the piucture data 
StringBuilder sb=new StringBuilder(); 
sb.AppendLine("declare @picquery as Varchar(4000)"); 
sb.AppendLine("set @picquery='Insert into Picture(PictureBinary) values (''"+imgbyte.ToString() +"'')'"); 
sb.AppendLine("exec(@picquery)"); 
// sb is then passed to another module where it is executed. 

Но тип двоичных данных неверен и запрос на вставку не выполняется. Что я делаю не так. столбец PictureBinary является VarBinary (MAX)

+0

У вас есть возможность использовать подготовленные операторы вместо генерации строки SQL? Если вы используете подготовленные инструкции, то .NET будет обрабатывать преобразование для вас. – mroach

+0

Мне нужно их написать и сохранить. сценарий будет выполнен позднее. –

ответ

1

Для записи двоичных данных SQL Server ожидает, что данные будут в шестнадцатеричном формате с ведущим 0x. Пример:

INSERT INTO images (name, image) VALUES ('photo.jpg', 0xAF03083FCE...) 

В целом при взаимодействии с базой данных Вам лучше всего с помощью параметризованных запросов и позволяя .NET написать окончательный SQL для вас. Он автоматически преобразует байтовые массивы в правильный формат.

параметризованных запросов

// assuming 'cn' is a SqlConnection that's already open 
var commandText= "INSERT INTO Picture (PictureBinary) VALUES (@bin)"; 
using (var cmd = new SqlCommand(commandText, cn)) 
{ 
    cmd.Parameters.Add("@bin", SqlDbType.Binary, imgByte.Length).Value = imgByte; 
    cmd.ExecuteNonQuery(); 
} 

Ручной запрос здание

Если по какой-то причине вы должны построить запрос вручную, это то, как вы могли бы сделать это:

// convert the byte array to a hex string 
var hexString = BitConverter.ToString(imgByte).Replace("-", ""); 
var sql = String.format("INSERT INTO Picture (PictureBinary) VALUES (0x{0})", hexString); 

Примечание: Использование BitConverter является одним из many способы преобразования байтов в шестнадцатеричные в C#. Here's a great SO answer comparing performance

+0

Позвольте мне проверить это –

+0

Да, это очень помогло. –

Смежные вопросы