Заливка и извлечение изображений из базы 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, изображения, базы данных, sqlite




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Коллекции Java: введение
Windows Portable Devices: получаем список папок и файлов на устройстве
Базы данных ADO.NET на языке C++\CLI