байт код картинки в тип данных image SQL

Рейтинг: 0Ответов: 1Опубликовано: 16.05.2023

В поисках решения, на многих сайтах, в том числе и этот, предлагают решение в виде запроса с параметрами.

Пример c MSDN https://learn.microsoft.com/ru-ru/dotnet/framework/data/adonet/sql/inserting-an-image-from-a-file :

 using (SqlConnection connection = new SqlConnection(  
    connectionString))  
  {
  SqlCommand command = new SqlCommand(  
    "INSERT INTO Employees (LastName, FirstName, " +  
    "Title, HireDate, ReportsTo, Photo) " +  
    "Values(@LastName, @FirstName, @Title, " +  
    "@HireDate, @ReportsTo, @Photo)", connection);
  
  command.Parameters.Add("@LastName",
     SqlDbType.NVarChar, 20).Value = lastName;  
  command.Parameters.Add("@FirstName",
      SqlDbType.NVarChar, 10).Value = firstName;  
  command.Parameters.Add("@Title",
      SqlDbType.NVarChar, 30).Value = title;  
  command.Parameters.Add("@HireDate",
       SqlDbType.DateTime).Value = hireDate;  
  command.Parameters.Add("@ReportsTo",
      SqlDbType.Int).Value = reportsTo;  
  
  command.Parameters.Add("@Photo",  
      SqlDbType.Image, photo.Length).Value = photo;  
  
  connection.Open();  
  command.ExecuteNonQuery();  
  }

Исходя из цели вопроса, хотелось бы узнать, какой необходимо создать запрос, чтобы не используя параметры для запроса, отправить байт код в тип данных image в SQL. Пробовал отправить запрос без параметра и с параметром, и как вы поняли, запрос с параметром сработал и картинка выводится.

Результат с параметром: введите сюда описание изображения

0x89504E470D0A1A0A0000...

Результат без параметра: введите сюда описание изображения

0x53797374656D2E427974655B5D

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

Строка:

command.Parameters.Add("@ImageData", SqlDbType.Image, 1000000);

Как я понял, здесь указывается тип image базы данных и количество символов(длина).

Задал вопрос GPT. Не знаю, кто, как к нему относится, но он выдал следующее сообщение:

К сожалению, вы не можете отправить изображение в виде байт кода в тип данных image в SQL, не используя параметры команды. Параметр позволяет указать тип данных для значения параметра, что очень важно, чтобы избежать ошибок при выполнении запроса в SQL Server.

Ответы

▲ 1Принят

К великому сожалению, не получилось сделать красиво, и все-таки использовал параметр. Распишу некоторые новые решения, которые заметил при использовании ADO.NET и также укажу некоторые моменты, которые дадут подсказку для решения, может поможет для тех, кто столкнулся с такой же проблемой.

Особенности ADO.NET:

ADO.NET довольно обширный инструмент по управлению базы данных. И довольно много вещей продумано. Первое, на что стоит обратить внимание, это написание запроса в базу данных.

Есть несколько методов написания:

  1. Если вам нужен вывод данных с помощью SELECT, то прописывайте через adapter

Пример:

adapter = new SqlDataAdapter(query, connection);
                dataTable = new DataTable();
                adapter.Fill(dataTable);

Таким образом вы сможете получить таблицу данных в виде DataTable. Для вывода в DataContext просто укажите ваш DataTable.

Для вывода в разные элементы управления(ListBox, DataGrid, ComboBox и т.д.) необходимо конвертировать в DataView с помощью метода DefaultView.

Пример:

dataGrid.ItemSource = dataTable.DefaultView
  1. Для добавление, изменение, удаление в базу данных, составляется запрос с помощью INSERT, UPDATE, DELETE.

Примеры:

UPDATE table SET columnName = variable, ... WHERE ...
INSERT INTO table VALUES (variable, ...)
DELETE FROM table WHERE columnName = variable ...

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

SqlCommand cmd = new SqlCommand(query, connection);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

Перейдем к особенностям написания. Есть возможность заменить параметры и вписывать переменные в запрос. Для этого в начале запроса ставим символ $

Пример:

 string query = $"SELECT '{columnName}' FROM table";

Также можем соединить несколько запросов в один:

string query = $"SELECT '{columnName}' FROM table" +
               $"DELETE FROM table WHERE columnName = '{variable}'";

Теперь перейдем к данному вопросу. Решений я не нашел, но, возможно, кто-то найдет. Главная проблема это тип данных. Я пытался пропихнуть тип данных byte[] в image, но главная проблема, что так нельзя, поэтому приходиться использовать параметр, так как можно указать размер массива и тип данных, в данном случае тип данных, который нужен SqlDbType.Image.

Пример:

command.CommandText = "UPDATE table SET columnName = @ImageData WHERE columnName = variable";
command.Parameters.Add("@ImageData", SqlDbType.Image, 1000000);
command.Parameters["@ImageData"].Value = image_bytes;
command.ExecuteNonQuery();

Если попробовать совместить метод написания запроса с использованием $ и SqlDbType.Image, то получиться написать в одну строчку. Будет меньше кода и намного понятнее.

И вообще изучайте и используйте новые инструменты для управления базы данных, например EF.