Отображать изображения в базе данных Access в WPF и C#

В этом примере показано, как вы можете отображать изображения, хранящиеся в базе данных Access в программе WPF. Вы можете сделать это с помощью связанных элементов управления, но я считаю этот подход менее запутанным, потому что вы делаете все явно в коде.

Когда программа запускается, следующий код подготавливает форму для отображения данных.

using System.Data.OleDb;
using System.IO;
...
// Соединение с базой данных.
private OleDbConnection Conn;

// Отображение списка названий.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // Создаем имя файла базы данных.
    // Предполагается, что он находится в каталоге исполняемого файла.
    string db_name =
        Directory.GetCurrentDirectory() +
        "\\Books.mdb";

    // Подключение к базе данных
    Conn = new OleDbConnection(
        "Provider=Microsoft.ACE.OLEDB.12.0;" +
        "Data Source=" + db_name + ";" +
        "Mode=Share Deny None");

    // Получить заголовки.
    OleDbCommand cmd = new OleDbCommand(
        "SELECT Title FROM Books ORDER BY Title",
        Conn);
    Conn.Open();
    OleDbDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
        lstTitles.Items.Add(reader.GetValue(0));
    reader.Close();
    Conn.Close();
}

Самый эффективный метод использования подключения к базе данных в .NET - это открыть их, принять меры и закрыть их в относительно коротких транзакциях. Программа может поддерживать соединение для последующего использования до тех пор, пока оно закрыто.

Этот код объявляет переменную OleDbConnection на уровне класса, чтобы она могла использовать ее во всем коде. Обработчик события Load формы создает строку, содержащую имя базы данных. Затем он создает объект OleDbConnection. В этом примере используется поставщик Microsoft.ACE.OLEDB.12.0, который работает для 64-разрядных систем, таких как мои. Это место, где вам, скорее всего, нужно будет внести изменения в программу.

(Чтобы найти строку подключения, которая работает для вашего компьютера и базы данных, запустите новый проект, откройте меню «Проект» и выберите «Добавить новый источник данных». Подключитесь к базе данных и посмотрите, какая строка подключения будет создана для вас.)

После создания соединения код создает объект OleDbCommand, который выбирает заголовки и связан с объектом соединения. Затем он открывает соединение и вызывает метод команды ExecuteReader для выполнения запроса. Он просматривает результаты, добавляя их в список ListBox программы, закрывает его и закрывает соединение.

Когда вы нажимаете на запись в ListBox, следующий код выполняет для отображения данных этой записи, включая изображение обложки книги.

// Отображение информации о выбранном заголовке.
private void lstTitles_SelectionChanged(object sender,
    SelectionChangedEventArgs e)
{
    if (lstTitles.SelectedIndex < 0) return;

    // Создаем объект команды для получения информации о названии.
    string title =
        lstTitles.SelectedItem.ToString().Replace("'", "''");
    OleDbCommand cmd = new OleDbCommand(
        "SELECT * FROM Books WHERE Title='" +
        title + "'",
        Conn);

    // Выполните команду.
    cmd.Connection = Conn;
    Conn.Open();
    OleDbDataReader reader = cmd.ExecuteReader();
    reader.Read();

    // Отображение текстовых данных.
    txtUrl.Text = reader[1].ToString();
    txtYear.Text = reader[2].ToString();
    txtIsbn.Text = reader[3].ToString();
    txtPages.Text = reader[4].ToString();

    // Отобразим изображение обложки.
    if (reader.IsDBNull(6))
        imgCover.Source = null;
    else
        imgCover.Source =
            BytesToImage((byte[])reader.GetValue(6));

    // Очистка.
    reader.Close();
    Conn.Close();
}

Этот код создает объект OleDbCommand, связанный с соединением, для выбора данных для выбранного заголовка. Затем он открывает соединение и выполняет метод ExecuteReader команды. Затем он копирует результирующие URL-адреса, данные Year, ISBN и Pages в TextBox es.

Если возвращаемое поле № 6 имеет значение null, запись не имеет изображения. В этом случае код устанавливает свойство imgCover Image элемента управления Изображение в null, чтобы он ничего не отображал.

Если изображение записи не null, программа вызывает метод BytesToImage для преобразования данных байта записи в изображение и отображения результата. Код заканчивается закрытием считывателя и соединения.

В следующем коде показан метод BytesToImage, который наиболее интересен для примера.

// Преобразуем массив байтов в BitmapImage.
private static BitmapImage BytesToImage(byte[] bytes)
{
    var bm = new BitmapImage();
    using (MemoryStream stream = new MemoryStream(bytes))
    {
        stream.Position = 0;
        bm.BeginInit();
        bm.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
        bm.CacheOption = BitmapCacheOption.OnLoad;
        bm.UriSource = null;
        bm.StreamSource = stream;
        bm.EndInit();
    }
    return bm;
}

Этот метод создает новый объект BitmapImage. Затем он создает MemoryStream, связанный с байтовыми данными, полученными из базы данных.

Он устанавливает позицию потока в начало и вызывает метод BitmapImage BeginInit, чтобы указать, что он собирается установить свойства объекта. Он устанавливает некоторые свойства, а затем устанавливает свойство StreamSource изображения в MemoryStream. Когда код вызывает EndInit, изображение загружается из потока. Затем метод возвращает результат BitmapImage.

Источник: http://csharphelper.com/blog/2015/07/display-images-in-an-access-database-in-wpf-and-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector