2016-07-27 3 views
0

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

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[]) 

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

An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as \"\" or [] are not allowed. Change the alias to a valid name.

+0

Ваш построитель строк sql просто вызывает 'ToString()' для вашей переменной типа 'byte []'. Показать метод, который создает строку запроса sql – Fabio

+3

Вы не должны * конструировать * операторы SQL - вы должны использовать ** параметры **, чтобы избежать атак SQL-инъекций! –

+1

'SqlParameter' не только избавляет вас от SQL Injection, но у вас не будет такой проблемы, потому что все входные значения будут правильно« преобразованы »в SqlParameters – Fabio

ответ

2

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

 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), чтобы сделать все это для вас, увеличивая изменения в системе безопасности и в будущем много Полегче.

0

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

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 заявления как проблема безопасности.

0

Вы должны использовать параметры при построении SQL Query, которые, очевидно, будут избегать атак SQL Injection. Как ваши запросы создаются, пока неясно. Что-то вроде этого должно сделать это за вас.

SqlParameter sParam = new SqlParameter("@image_byte_array", SqlDbType.VarBinary) 
{ 
Value = image 
}; 
SqlHelper.ExecuteNonQuery(Transaction, CommandType.Text, sql_insert_string, sParam) 
Смежные вопросы