Заливка и извлечение изображений из базы sqlite на C#
Так интересно совпало, что я сейчас одновременно работаю над двумя очень похожими проектами. Одно из похожих их свойств – это хранение данных в базе sqlite. И в этом материале я расскажу вам, как заливать в данную базу картинки, а также извлекать и отображать без потери качества.
Как подключать sqlite к проекту C#, мы научились, теперь научимся остальному. Мы в прошлых проектах напрямую закидывали переменные в базу, без приведения типов, надеясь, что там все само разберется. Очень часто это так и есть, но для вообще такой вариант подходит больше для отладки, нежели для релизной программы.
Итак, кидаем на форму кнопку и элемент picturebox, даем ему имя, к примеру, pbFoto. Также добавляем элемент openFileDialog1. По нажатию кнопки должен у нас выполняться вот такой код:
private void button3_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "JPEG файлы (*,.jpg)|*.jpg|Bitmap файлы (*.bmp)|*.bmp|Все файлы (*.*)|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pbFoto.ImageLocation = openFileDialog1.FileName;
}
}
То есть мы выбираем файл с нужным фильтром, затем изменяем свойство ImageLocation – чтобы картинка отобразилась в элементе.
Далее интересный момент. Нам надо это изображение перевести в массив байт и засунуть в базу. Если мы возьмем этот же ImageLocation и проведем вот такую операцию:
byte[] bData = File.ReadAllBytes(pbFoto.ImageLocation); File.WriteAllBytes(pbFoto.ImageLocation, bData);То массив байт мы получим и сможем его залить в базу. Однако, качество изображения у данного способа будет неважным. Поэтому мы пойдем другим способом. Добавим метод:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
И используем его так:
byte[] bData = imageToByteArray(pbFoto.Image);Далее вставляем картинку в базу по букварю, а не как мы делали раньше:
using (SQLiteCommand command = new SQLiteCommand(m_dbConn))
{
command.CommandText = "insert into Chapter (id, img) VALUES (@id, @img)";
command.Parameters.Add("@id", DbType.Int32).Value = 4;
command.Parameters.Add("@img", DbType.Binary).Value = bData;
command.ExecuteNonQuery();
}
Извлекаем вот так:
m_sqlCmd.CommandText = "SELECT * FROM Chapter WHERE id ='" + id + "'";
try
{
SQLiteDataReader r = m_sqlCmd.ExecuteReader();
r.Read();
MemoryStream stmBLOBData = new MemoryStream((byte[])r["img"]);
pbFoto.Image = Image.FromStream(stmBLOBData);
pbFoto.Refresh();
r.Close();
r.Dispose();
}
catch (SQLiteException ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Все просто, не правда ли?

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты