Вставка байтового массива в SQL Server

Я строюsql_insert_string быть использованным вMicrosoft.ApplicationBlocks.Data.SqlHelper использоваться следующим образом:

SqlHelper.ExecuteNonQuery(Transaction, CommandType.Text, sql_insert_string)

Когда я наводю курсор мыши на оператор SQL, он выглядит так:

 string sql_insert_string = "Insert into images_table(image_id,     image_byte_array) values ('123', System.Byte[])

Одним из значений вставки является байтовый массив, как показано выше. Переменная имеет значение в байтовом массиве, скажем, как byte [6738]. Но послеsql_insert_string построен, это приходит какSystem.Byte[],image_byte_array тип столбцаvarbinary(max), База данных - SQL Server 2008. Из-за этого база данных выдает следующую ошибку:

Имя объекта или столбца отсутствует или пусто. Для операторов SELECT INTO убедитесь, что у каждого столбца есть имя. Для других операторов ищите пустые псевдонимы. Псевдонимы, определенные как \ "\" или [], не допускаются. Измените псевдоним на допустимое имя.

 marc_s27 июл. 2016 г., 06:16
Ты не должен бытьстроительство Операторы SQL - вы должны использоватьпараметры чтобы избежать атак SQL-инъекций!
 ydoow27 июл. 2016 г., 06:21
Это не правильный SQL-оператор, который вы создали.
 Fabio27 июл. 2016 г., 06:18
SqlParameter не только спасает вас от SQL-инъекций, к тому же у вас не будет такой проблемы, потому что все входные значения будут правильно "преобразованы" в SqlParameters
 Fabio27 июл. 2016 г., 06:15
Ваш строитель строки SQL просто позвонитеToString() на вашей переменной типаbyte[], Показать метод, который создает строку запроса SQL

Ответы на вопрос(3)

Решение Вопроса

Вы можете вставить байтовый массив следующим образом:

        private void FireSql(byte[] input)
        {
            const string sql_insert_string =
                "Insert into images_table(image_id, image_byte_array) values (@image_id, @image_byte_array)";

            SqlTransaction transaction = null; //wherever you get the transaction obj from.

            var imageIdParam = new SqlParameter("@image_id", SqlDbType.Int, 4)
            {
                Direction = ParameterDirection.Input,
                Value = 123
            }; //change the data type to whatever data type you are expecting

            var byteParam = new SqlParameter("@image_byte_array", SqlDbType.VarBinary)
            {
                Direction = ParameterDirection.Input,
                Size = input.Length,
                Value = input
            }; //change the data type to whatever data type you are expecting

            SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, sql_insert_string, imageIdParam, byteParam);
        }

Я бы предложил посмотреть на ОРМ (https://en.wikipedia.org/wiki/Object-relational_mapping) как Entity Framework (http://www.asp.net/entity-framework) сделать все это для вас при одновременном повышении безопасности и будущих изменений.

Вы можете использовать

string sql_insert_string = 
    String.Format("INSERT INTO images_table(image_id, image_byte_array) VALUES ('123', CAST('{0}' AS VARBINARY(MAX)))", System.Byte[].ToString());

И да, как прокомментировал @marc_s, вы не должны конструировать операторы SQL как проблему безопасности.

Вы должны использоватьпараметры при создании SQL-запроса, который, очевидно, позволит избежать атак SQL-инъекций. Как строятся ваши запросы, пока неясно. Нечто подобное должно сделать это для вас.

SqlParameter sParam = new SqlParameter("@image_byte_array", SqlDbType.VarBinary)
{
 Value = image
};
SqlHelper.ExecuteNonQuery(Transaction, CommandType.Text, sql_insert_string, sParam)

Ваш ответ на вопрос