Как сохранить несколько изображений в Access на C#
Пример включает базу данных Access. К сожалению, если вы сохраняете несколько изображений в базе данных и затем открываете базу данных в Access, Access удаляет изображения. Он просто не понимает данные изображения.
Чтобы упростить использование базы данных, программа примера включает в себя кнопку «Загрузить все», которая загружает сразу несколько изображений. Он загружает одно изображение для каждой записи в таблице Books. Для загрузки этих изображений программа использует следующий код.
// Загрузка изображений для всех записей.
private void btnLoadAll_Click(object sender, EventArgs e)
{
string[] titles =
{
"Advanced Visual Basic Techniques",
"Beginning Database Design Solutions",
...
};
string[] filenames =
{
@"Images\avbts.jpg",
@"Images\db_design_s.jpg",
...
};
this.Cursor = Cursors.WaitCursor;
string image_dir = Path.GetFullPath(
Path.Combine(Application.StartupPath, "..\\..")) + "\\";
// Загружаем изображения.
for (int i = 0; i < titles.Length; i++)
{
LoadRecordImage(titles[i], image_dir + filenames[i]);
}
this.Cursor = Cursors.Default;
MessageBox.Show("Loaded " + titles.Length + " images.");
}
Метод начинается с создания двух массивов, один из которых содержит названия книг, а другой - имена файлов изображений. Изображения сохраняются в подкаталоге Images проекта, поэтому имена файлов начинаются с Images \.
После определения массивов программа использует метод Combine класса Path для объединения пути запуска приложения с относительным путем .. \ .. для поиска каталога проекта. (Тот, который содержит код, а не исполняемый файл.) Затем он использует GetFullPath, чтобы превратить комбинированный путь в действительный полностью определенный путь.
Этот код проходит через названия книг, вызывая метод LoadRecordImage, показанный в следующем коде для каждого названия и имени файла.
// Загрузите изображение одной записи.
private void LoadRecordImage(string title, string filename)
{
try
{
// Получить изображение.
Bitmap bm = new Bitmap(filename);
// Установите изображение в базе данных.
title = title.Replace("'", "''");
OleDbCommand cmd = new OleDbCommand(
"UPDATE Books SET CoverImage=@Image WHERE Title='" +
title + "'",
Conn);
// Создаем массив байтов, содержащий изображение.
byte[] image_bytes = ImageToBytes(bm, ImageFormat.Png);
// Добавьте изображение в качестве параметра.
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
{
Conn.Close();
}
}
// Загрузите изображение одной записи.
private void LoadRecordImage (название строки, имя файла строки)
{
пытаться
{
// Получить изображение.
Bitmap bm = новый битмап (имя файла);
// Установите изображение в базе данных.
title = title.Replace ("'", "' '");
OleDbCommand cmd = новый OleDbCommand (
"UPDATE Books SET CoverImage = @ Image WHERE Название = '" +
title + "'",
Штат Коннектикут);
// Создаем массив байтов, содержащий изображение.
byte [] image_bytes = ImageToBytes (bm, ImageFormat.Png);
// Добавьте изображение в качестве параметра.
OleDbParameter param = новый OleDbParameter ();
param.OleDbType = OleDbType.Binary;
param.ParameterName = "Изображение";
param.Value = image_bytes;
cmd.Parameters.Add (пары);
// Выполнить команду (без возвращаемого значения).
cmd.Connection = Conn;
Conn.Open ();
cmd.ExecuteScalar ();
}
catch (Exception ex)
{
MessageBox.Show (ex.Message);
}
в конце концов
{
Conn.Close ();
}
}
...
Для этого он создает объект OleDbParameter для растрового изображения, определяет его свойства соответствующим образом и выполняет оператор UPDATE.
