Чтение и запись изображения в базу данных SQLite
Как-то, в комментарии к одной из моей статей спрашивали, как реализовать запись и чтение изображений в базу данных SQLite? Отвечаю.
Я создал тестовый проект, в котором файл читается с жесткого диска и записывается в базу данных, а затем, сразу, читается и отображается на экране. Общий принцип заключается в том, что необходимо создать поле типа BLOB и в виде массива byte записывать и считывать данные.
Тестовая таблица выглядит так:
CREATE TABLE [test] ( [id] INTEGER, [text] TEXT, [img] BLOB);
Поле img имеет тип BLOB, в котором и будет храниться изобраение.
Далее, считываем файл и переводим его в массив Byte.
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(stream);
long totalBytes = new FileInfo(path).Length;
byte[] buffer = br.ReadBytes((Int32)totalBytes);
stream.Close();
br.Close();
...
}
Переменная buffer и будет хранить необходимы для записи данные.
Запись я выполняю с использованием своей любимой библиотеки dbFacade.
ParametersCollection paramss = new ParametersCollection();
paramss.Add("img", buffer, DbType.Binary);
dbFacade db = new dbFacade(pathToDatabase);
db.Update("test", paramss, "id = " + id);
В итоге у меня получается такой незамысловатый код.
В редакторе можно наблюдать следующую картину.

Чтение еще проще. Читаем данные сразу в массив Byte и заносим в MemoryStream, а от туда уже и в объект Image (с последним уже можно делать все, что угодно).
Select select = new Select().From("test").Columns("img, text").Where("id = " + id);
Byte[] buffer = (Byte[])new dbFacade(pathToDatabase).FetchOneRow(select)["img"];
MemoryStream ms = new MemoryStream(buffer);
return Image.FromStream(ms);
В итоге, код возвращает Image, который я «закидываю» в PictureBox.
Стоит отметить, что таким образом вы можете хранить не только файлы картинок. Это могут быть абсолютно любые файлы.
Популярность: 7%
Если у вас возникли вопросы, вы можете оставить их в комментариях



Есть ли смысл хранить настройки сайта (программы) в SQLite в виде строк?
Смысла нет, т.к. приходится подключать дополнительную библиотеку и т.д. Для этих целей хорошо подходит стандартный механизм работы с настройками, или в случае сайта, можно использовать сереализацию — xml или бинарную.
Настройки сайта обычно хранятся в web.config.
В web.config удобно хранить, если у тебя сайт ОДИН и живет в одном вечном месте.
Если же сайт надо деплоить в разные места с различными конфигурациями (например, development, testing, production), использование конфига становиться довольно трудоемко.
Выхода 2:
- либо по максимуму выносить настройки в код (получиться автоконфигурация при старте)
- хранить настройки в базе (в таком случае в конфиге/коде будет храниться только один ConnectionSting).
Да, и еще в отношении сайтов на IIS 7.x, есть хорошая практика кешировать настройки средствами веб-сервера, для повышения производительности.
Когда будет обновление Unipaste?
Обновления Unipaste пока не предвидится.
Может знает кто, ситуация изменилась? Есть ли ожидания Unipaste
Пока нет. У меня нет времени на его разработку.