Как хранить картинку в базе данных ms sql
Перейти к содержимому

Как хранить картинку в базе данных ms sql

  • автор:

Вставка изображения из файла

Большой двоичный объект (BLOB) можно записать в базу данных в виде двоичных или символьных данных в зависимости от типа поля в источнике данных. Большой двоичный объект — это универсальный термин, который относится к типам данных text , ntext и image , которые обычно содержат документы и изображения.

Чтобы записать значение BLOB в базу данных, выполните соответствующую инструкцию INSERT или UPDATE и передайте значение BLOB в качестве входного параметра (см . раздел Настройка параметров и типов данных параметров). Если ваш большой двоичный объект хранится в виде текста, например поле text SQL Server, большой двоичный объект можно передать в виде строкового параметра. Если большой двоичный объект хранится в двоичном формате, например в поле image SQL Server, массив типа byte можно передать как двоичный параметр.

Пример

В следующем примере кода данные о сотрудниках добавляются в таблицу «Сотрудники» в базе данных Northwind. Фотография сотрудника считывается из файла и добавляется в поле «Фото» в таблице, которая является полем изображения.

Public Shared Sub AddEmployee( _ lastName As String, _ firstName As String, _ title As String, _ hireDate As DateTime, _ reportsTo As Integer, _ photoFilePath As String, _ connectionString As String) Dim photo() as Byte = GetPhoto(photoFilePath) Using connection As SqlConnection = New SqlConnection( _ connectionString) Dim command As SqlCommand = 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() End Using End Sub Public Shared Function GetPhoto(filePath As String) As Byte() Dim stream As FileStream = new FileStream( _ filePath, FileMode.Open, FileAccess.Read) Dim reader As BinaryReader = new BinaryReader(stream) Dim photo() As Byte = reader.ReadBytes(stream.Length) reader.Close() stream.Close() Return photo End Function 
public static void AddEmployee( string lastName, string firstName, string title, DateTime hireDate, int reportsTo, string photoFilePath, string connectionString) < byte[] photo = GetPhoto(photoFilePath); 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(); >> public static byte[] GetPhoto(string filePath)

См. также раздел

  • Использование команд для изменения данных
  • Извлечение двоичных данных
  • Двоичные данные и данные больших значений SQL Server
  • SQL Server сопоставления типов данных
  • Общие сведения об ADO.NET

Как добавить картинку в базу данных sql

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

Для сохранения ссылки на файл в базе данных, нужно создать таблицу, которая будет содержать информацию о картинках, например, название, путь к файлу и описание. Для добавления новой картинки в базу данных необходимо выполнить следующие шаги:

  1. Сохранить картинку на диске или в облаке и получить ее путь или ссылку.
  2. Открыть соединение с базой данных и выполнить SQL-запрос на вставку новой записи в таблицу картинок. Пример SQL-запроса:

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

Как хранить картинку в базе данных ms sql

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Сохранение в базу данных файлов

Рассмотрим, как мы можем сохранять файлы, в частности, файлы изображений в базу данных. Для этого добавим в базу данных новую таблицу Images с четырьмя столбцами: Id (первичный ключ и идентификатор, имеет тип int), FileName (будет хранить имя файла и имеет тип nvarchar), Title (будет хранить заголовок файла и также имеет тип nvarchar) и ImageData (будет содержать бинарные данные файла и имеет тип varbimary(MAX)).

Сохранение файлов в базу данных

Определим код, в котором будут загружаться данные в таблицу:

private static void SaveFileToDatabase() < string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); SqlCommand command = new SqlCommand(); command.Connection = connection; command.CommandText = @"INSERT INTO Images VALUES (@FileName, @Title, @ImageData)"; command.Parameters.Add("@FileName", SqlDbType.NVarChar, 50); command.Parameters.Add("@Title", SqlDbType.NVarChar, 50); command.Parameters.Add("@ImageData", SqlDbType.Image, 1000000); // путь к файлу для загрузки string filename = @"C:\Users\Eugene\Pictures\cats.jpg"; // заголовок файла string title = "Коты"; // получаем короткое имя файла для сохранения в бд string shortFileName = filename.Substring(filename.LastIndexOf('\\')+1); // cats.jpg // массив для хранения бинарных данных файла byte[] imageData; using (System.IO.FileStream fs = new System.IO.FileStream(filename, FileMode.Open)) < imageData = new byte[fs.Length]; fs.Read(imageData, 0, imageData.Length); >// передаем данные в команду через параметры command.Parameters["@FileName"].Value = shortFileName; command.Parameters["@Title"].Value = title; command.Parameters["@ImageData"].Value = imageData; command.ExecuteNonQuery(); > >

После выполнения этой программы в базе данных появится соответствующая запись:

Сохранение изображений в базе данных

Извлечение файлов из базы данных

В прошлой теме мы рассмотрели, как добавить файл в базу данных. Теперь произведем обратную операцию — получим файл из БД. Вначале определим класс файла, который упростит работу с данными:

public class Image < public Image(int id, string filename, string title, byte[] data) < FileName = filename; Title = title; Data = data; >public int Id < get; private set; >public string FileName < get; private set; >public string Title < get; private set; >public byte[] Data < get; private set; >>

Затем в коде программы определим следующий метод:

private static void ReadFileFromDatabase() < string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; Listimages = new List(); using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); string sql = "SELECT * FROM Images"; SqlCommand command = new SqlCommand(sql, connection); SqlDataReader reader = command.ExecuteReader(); while(reader.Read()) < int string filename = reader.GetString(1); string title = reader.GetString(2); byte[] data = (byte[])reader.GetValue(3); Image image = new Image(id, filename, title, data); images.Add(image); >> // сохраним первый файл из списка if(images.Count>0) < using (System.IO.FileStream fs = new System.IO.FileStream(images[0].FileName, FileMode.OpenOrCreate)) < fs.Write(images[0].Data, 0, images[0].Data.Length); Console.WriteLine("Изображение '' сохранено", images[0].Title); > > >

В этом методе с помощью SqlDataReader мы получаем значения из БД и по ним создаем объект Image, который потом добавляется в список. И в конце смотрим, если в списке есть элементы, то берем первый элемент и сохраняем его на локальный компьютер. И после сохранения в папке нашей программы появится загруженный из базы данных файл.

Сохранение изображения в БД C#

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

Оптимальным выходом из данной ситуации является представление изображения в виде массива байтов byte[]

Набор байтов — это самый простой способ представления файла изображения в виде данных. Строка не подходит, поскольку она содержит коды символов, а файл изображения не состоит из символов. Так как не существует специального класса для хранения данных файла изображения, для этого отлично подходит массив байтов.

Любой файл можно рассматривать как набор байтов, поэтому массив байтов является результатом чтения файла в виде двоичных данных. Файл также может быть декодирован как определенный формат, например, текстовый файл, результатом которого является строка, или формат сжатого изображения (JPEG, GIF, PNG и т. д.), результатом которого является Bitmap.

Программное обеспечение

Microsoft SQL Server

Microsoft SQL Server является одной из наиболее популярных систем управления базами данных (СУБД) в мире. Данная СУБД подходит для самых различных проектов: от небольших приложений до больших высоконагруженных проектов.

SQL Server был создан компанией Microsoft. Первая версия вышла в 1987 году. А текущей версией является версия 2019, которая вышла в 2019 году и которая будет использоваться в текущем руководстве.

SQL Server долгое время был исключительно системой управления базами данных для Windows, однако начиная с версии 16 эта система доступна и на Linux.

SQL Server характеризуется такими особенностями как:

  • Производительность. SQL Server работает очень быстро.
  • Надежность и безопасность. SQL Server предоставляет шифрование данных.
  • Простота. С данной СУБД относительно легко работать и вести администрирование.

Центральным аспектом в MS SQL Server, как и в любой СУБД, является база данных. База данных представляет хранилище данных, организованных определенным способом. Нередко физически база данных представляет файл на жестком диске, хотя такое соответствие необязательно. Для хранения и администрирования баз данных применяются системы управления базами данных (database management system) или СУБД (DBMS). И как раз MS SQL Server является одной из такой СУБД.

SQL Server Management Studio

Для удобного управления базами данных и различными опциями и настройками в MS SQL Server установим специальное средство администрирования, которое называется SQL Server Management Studio (SSMS). Данную программу можно использовать для создания баз данных и их таблиц, написания и выполнения запросов к бд, а также для много другого.

Рис.1 MSSMS

Реализация

Приступим к реализации поставленное задачи, а именно сохранение изображение в БД.

Шаг.1 Создадим простой проект WPF, назовем его Image Test WPF (Рис.2)

Рис.2 Создание проекта

Шаг.2 Добавим на форму компонент Image, установим его атрибут name как «image», а также зададим его ширину и высоту(Рис.3)

Рис.3 Добавление компонента image

Код

Шаг.3 Добавим кнопку для выбора изображения (Рис.4)

Рис.4 Добавление кнопки

Код

Шаг.4 Пропишем код для открытия диалогового окна выбора файла

Для этого пропишем событие клика кнопки

Рис.5 клик

Код

Два раза нажмем по кнопке и перейдем в метод (Рис.6):

Рис.6 Код обработчика

Далее пропишем код для вызова диалогового окна выбора файла OpenFIleDialog

Пропишем подключение нужных директив

using Microsoft.Win32; using System.IO;

Рис.7 Логика выбора изображения

Код

private void SelectImage(object sender, RoutedEventArgs e) < OpenFileDialog openFileDialog = new OpenFileDialog(); // создаем диалоговое окно openFileDialog.ShowDialog(); // показываем byte[] image_bytes = File.ReadAllBytes(openFileDialog.FileName); // получаем байты выбранного файла >

Шаг.5 Создадим базу данных

В программе My Sql Management Studio создадим в базе данных таблицу и назовем ее Images (Рис.8)

Рис.8 Таблица БД

Установим для поля image тип данных varbinary(MAX)

Шаг. 6 Допишем код выбора изображения с использованием библиотеки для сохранения изображения

Скачайте файл с github и поместите в ваш проект (Рис.9)

И в данном классе пропишите библиотеки:

using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Windows.Media.Imaging;

Рис.9 Структура проекта

Добавим в проект класс для работы с базой данных

Рис.10 Класс для работа с БД

Переменную sqlConnection замените на свои данные

Шаг. 7 Добавим еще одну кнопку для загрузки изображения из базы данных (Рис.11)

Рис.11 кнопка загрузки

Шаг. 8 Напишем логику загрузки изображения из БД, а также сохранения

Дополним код выбора изображения так, чтобы он еще и сохранял выбранное фото в БД (Рис.12)

Рис.12 Запись в бд

private void SelectImage(object sender, RoutedEventArgs e) < OpenFileDialog openFileDialog = new OpenFileDialog(); // создаем диалоговое окно openFileDialog.ShowDialog(); // показываем byte[] image_bytes = File.ReadAllBytes(openFileDialog.FileName); // получаем байты выбранного файла string connectionString = "server=192.168.140.128;Trusted_Connection=No;DataBase=Test;User=s;PWD=s"; // строка подключения using (SqlConnection connection = new SqlConnection(connectionString)) // создаем подключение < connection.Open(); // откроем подключение SqlCommand command = new SqlCommand(); // создадим запрос command.Connection = connection; // дадим запросу подключение command.CommandText = @"INSERT INTO images VALUES (@ImageData)"; // пропишем запрос command.Parameters.Add("@ImageData", SqlDbType.Image, 1000000); command.Parameters["@ImageData"].Value = image_bytes;// скалярной переменной ImageData присвоем массив байтов command.ExecuteNonQuery(); // запустим >>

Пропишем логику загрузки из БД:

Рис.13 Загрузка из БД

 private void LoadImage(object sender, RoutedEventArgs e) < DataTable matcher_query = SqlModel.Select("SELECT * from Images"); // запрос image.Source = ByteImage.Convert(ByteImage.GetImageFromByteArray((byte[])matcher_query.Rows[matcher_query.Rows.Count - 1][0])); // берем из запроса последнюю строку и ее массив байтов >

Шаг. 9 Протестируем программу

Расширим окно, чтобы увидеть кнопку выбора изображения

Далее выберем изображение и нажнем загрузить

Как видим все работает!

Объяснение кода загрузки

ByteImage.Convert() — преобразует изображение в понятный для wpf вид

ByteImage.GetImageFromByteArray() — преобразует массив байтов в иозображение

 image.Source = ByteImage.Convert(ByteImage.GetImageFromByteArray(массив байтов);

Преобразует массив байтов в изображение, конвертирует его в понятный для wpf вид и устанавливает в компонент image

Краткий экскурс по работе с библиотекой

Скачайте файл с github и поместите в ваш проект файл

Чтобы перевести массив байтов byte[] в изображение и поместить его в компонент Image нужно соделать следующее:

ByteImage.Convert(ByteImage.GetImageFromByteArray(массив байтов));

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

byte[] some_image_bytes = File.ReadAllBytes("image.jpg");

Вывод

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

  • .NET
  • Администрирование баз данных
  • C#
  • Разработка под Windows

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *