Как сохранять изображения в базу данных MS SQL и извлекать изображения из базы данных (C#)
Захаров Виктор · 24 сентября 2017 (обновлено 11.08.2022) · На чтение: 7 минКомментарии: 5
Разрабатывая инфраструктуру для автоматических тестов, а именно функционал отвечающий за хранения результатов тестирования в базе данных, мне необходимо было решить задачу хранения изображений в базе данных (Microsoft SQL Server). Изучив вопрос понял, что есть множество способов. Здесь рассмотрим два из них, которые я реализовал и выбрал оптимальный для себя.
Рассмотрим примеры записи картинок в базу данных и извлечение картинок из базы данных.
Хранение изображений в MS SQL в двоичном формате в ячейке с типом «image»
Создадим базу данных и таблицу:
USE [master]
GO
CREATE DATABASE [dbtest]
ON PRIMARY
( NAME = N'dbtest', FILENAME = N'c:\DB\dbtest.mdf')
LOG ON
( NAME = N'dbtest_log', FILENAME = N'c:\DB\dbtest.ldf')
GO
USE [dbtest]
GO
CREATE TABLE [report] (
[id] bigint NOT NULL PRIMARY KEY IDENTITY,
[screen] IMAGE DEFAULT (0x),
[screen_format] VARCHAR(5) DEFAULT NULL,
);
Обратите внимание на тип поля «screen».
Поместим любую картинку на диск «С». У меня картинка в формате jpg — «primer.jpg».
Создадим в Visual Studio консольное приложение. Добавим в файл «Program.cs»
using System; using System.IO; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using System.Drawing;
Запишем изображение в базу данных методом PutImageBinaryInDb:
private static void PutImageBinaryInDb(string iFile)
{
byte[] imageData = null;
FileInfo fInfo = new FileInfo(iFile);
long numBytes = fInfo.Length;
FileStream fStream = new FileStream(iFile, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fStream);
imageData = br.ReadBytes((int)numBytes);
string iImageExtension = (Path.GetExtension(iFile)).Replace(".", "").ToLower();
using (SqlConnection sqlConnection = new SqlConnection(@"Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=dbtest; User Id=sa; Password=pass"))
{
string commandText = "INSERT INTO report (screen, screen_format) VALUES(@screen, @screen_format)";
SqlCommand command = new SqlCommand(commandText, sqlConnection);
command.Parameters.AddWithValue("@screen", (object)imageData);
command.Parameters.AddWithValue("@screen_format", iImageExtension);
sqlConnection.Open();
command.ExecuteNonQuery();
sqlConnection.Close();
}
}
Запускаем приложение и в указанное нами место сохраняется изображение из базы.
Данный метод я использую сейчас, так как в двоичном формате данные в базе занимают места меньше примерно в 100 раз по сравнению с методом, который я опишу дальше. Но возможно кому-то может понадобится описанный далее метод.
Хранение изображений в MS SQL в формате base64 в ячейке с типом «varchar»
В данном методе мы будем конвертировать изображения в base64. Создадим новую таблицу:
Запускаем приложение и в указанное нами место сохраняется изображение из базы.
Вот и рассмотрели с вами методы сохранения изображения в базу данных MS SQL и извлечения изображения из базы данных. Есть ещё метод с использованием FILESTREAM, когда изображение пишется в файловую систему, но работа с ним идёт через обычное обращение к БД, но этот метод я не рассматривал, так как мне он пока не нужен.
Приложил для примера проект консольного приложения, которое содержит все описанные мной методы: скачать пример.
Виктор благодарю вас за такой подробный пример. Подскажите пожалуйста, какое количество изображений поместится к примеру в базе данных размером 500Гб если возьмем к примеру стандартный размер фотографии 2Мб. В двоичном формате и в формате base64? По вашему опыту. Спасибо.
Честно скажу — никогда не замерял. Вы можете попробовать экспериментально проверить. Запомнить размер БД и записать картинку в БД в одном формате — сверить размер БД, во втором формате — сверить размер БД. Потом разделить 500Гб, на тот размер, на который увеличилась база, и поймёте сколько всего изображений поместиться в базу на 500Гб. Если база в себе содержит не только изображения, то надо и это учитывать при расчёте роста БД.
Ммм…Думаю всем будет интересны основы работы с SQLite. + Хитрости и тонкости. Работа со сложными объектами(музыка, фото) Какие ограничения у BD. Работа с базой через сеть. И т.д.т.п У вас понятный для новичков ход мыслей и стиль изложения ))
Виктор благодарю вас за такой подробный пример.
Подскажите пожалуйста, какое количество изображений поместится к примеру в базе данных размером 500Гб если возьмем к примеру стандартный размер фотографии 2Мб. В двоичном формате и в формате base64? По вашему опыту. Спасибо.
Честно скажу — никогда не замерял.
Вы можете попробовать экспериментально проверить.
Запомнить размер БД и записать картинку в БД в одном формате — сверить размер БД, во втором формате — сверить размер БД. Потом разделить 500Гб, на тот размер, на который увеличилась база, и поймёте сколько всего изображений поместиться в базу на 500Гб.
Если база в себе содержит не только изображения, то надо и это учитывать при расчёте роста БД.
Ммм…Думаю всем будет интересны основы работы с SQLite.
+ Хитрости и тонкости.
Работа со сложными объектами(музыка, фото)
Какие ограничения у BD.
Работа с базой через сеть.
И т.д.т.п
У вас понятный для новичков ход мыслей и стиль изложения ))
Пример украл в шпаргалку.
Спасибо.
А для работы с SQLite ничего интересного нет?
Сейчас как раз работаю с SQLite. Что интересует конкретно?