Сохранение изображений в базе данных Access в WPF и C#
Пример показывает, как вы можете отображать изображения, сохраненные в базе данных Access. Конечно, возникает вопрос: «Как сохранить изображения в базе данных в первую очередь?» В этом примере показан один из способов сделать это.
Когда вы выбираете книгу из ListBox, а затем нажмите кнопку «Установить изображение», выполняется следующий код.
// Установите изображение для этого заголовка.
private void btnSetImage_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter =
"Image files|*.bmp;*.jpg;*.gif;*.png;*.tif|All files|*.*";
dlg.FilterIndex = 1;
if (dlg.ShowDialog() == true)
{
try
{
// Отображение изображения.
BitmapImage bm =
new BitmapImage(new Uri(dlg.FileName));
imgCover.Source = bm;
// Установите изображение в базе данных.
// Поле CoverImage имеет тип OLE Object.
string title =
lstTitles.SelectedItem.ToString().Replace("'", "''");
OleDbCommand cmd = new OleDbCommand(
"UPDATE Books SET CoverImage=@Image WHERE Title='" +
title + "'",
Conn);
// Создаем массив байтов, содержащий изображение.
byte[] image_bytes = ImageToBytes(bm);
// Добавьте изображение в качестве параметра.
OleDbParameter param = new OleDbParameter();
param.OleDbType = OleDbType.Binary;
param.ParameterName = "Image";
param.Value = image_bytes;
cmd.Parameters.Add(param);
// Выполнить команду (без возвращаемого значения).
cmd.Connection = Conn;
Conn.Open();
cmd.ExecuteScalar();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (Conn.State != ConnectionState.Closed)
Conn.Close();
}
}
}
Этот код начинается с создания OpenFileDialog, устанавливая его свойства Filter и FilterIndex и отображая диалог. Если пользователь выбирает файл, метод создает BitmapImage из файла и отображает его в элементе управления imgCover Image.
Далее код создает инструкцию SQL INSERT для обновления изображения выбранного заголовка. Он вызывает метод ImageToBytes (описанный в скором времени) для преобразования BitmapImage в массив байтов и создает объект параметра для байтов. Затем он вызывает метод ExecuteScalar команды для обновления записи.
В следующем коде показан способ ImageToBytes.
// Преобразование BitmapImage в массив байтов.
private static byte[] ImageToBytes(BitmapImage image)
{
byte[] data;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
data = ms.ToArray();
}
return data;
}
Этот метод создает объект JpegBitmapEncoder для кодирования растрового изображения в виде данных JPEG. Он добавляет кадр в кодировщик для представления изображения. Затем он создает MemoryStream и вызывает метод Сохранить кодера, чтобы заставить его записывать свои данные в MemoryStream. Наконец, код вызывает метод MemoryStream ToArray для преобразования данных в массив байтов, который возвращает метод.
