Сохранение изображений в базе данных Access в WPF и C#
Пример
Когда вы выбираете книгу из ListBox, а затем нажмите кнопку «Установить изображение», выполняется следующий код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
// Установите изображение для этого заголовка. 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Преобразование 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 для преобразования данных в массив байтов, который возвращает метод.