байт код картинки в тип данных image SQL
В поисках решения, на многих сайтах, в том числе и этот, предлагают решение в виде запроса с параметрами.
Пример 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 довольно обширный инструмент по управлению базы данных. И довольно много вещей продумано. Первое, на что стоит обратить внимание, это написание запроса в базу данных.
Есть несколько методов написания:
- Если вам нужен вывод данных с помощью
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
- Для добавление, изменение, удаление в базу данных, составляется запрос с помощью
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.

