Сохранение и извлечение файлов из базы данных

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Сохранение в базу данных файлов

Рассмотрим, как мы можем сохранять файлы, в частности, файлы изображений в базу данных. Для этого добавим в базу данных новую таблицу Images с четырьмя столбцами: Id (первичный ключ и идентификатор, имеет тип int), FileName (будет хранить имя файла и имеет тип nvarchar), Title (будет хранить заголовок файла и также имеет тип nvarchar) и ImageData (будет содержать бинарные данные файла и имеет тип varbimary(MAX)).

Сохранение файлов в базу данных

Определим код, в котором будут загружаться данные в таблицу:

private static void SaveFileToDatabase()
{
    string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
	using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandText = @"INSERT INTO Images VALUES (@FileName, @Title, @ImageData)";
        command.Parameters.Add("@FileName", SqlDbType.NVarChar, 50);
        command.Parameters.Add("@Title", SqlDbType.NVarChar, 50);
        command.Parameters.Add("@ImageData", SqlDbType.Image, 1000000);

		// путь к файлу для загрузки
        string filename = @"C:\Users\Eugene\Pictures\cats.jpg";
		// заголовок файла
        string title = "Коты";
		// получаем короткое имя файла для сохранения в бд
        string shortFileName = filename.Substring(filename.LastIndexOf('\\')+1); // cats.jpg
		// массив для хранения бинарных данных файла
        byte[] imageData;
        using (System.IO.FileStream fs = new System.IO.FileStream(filename, FileMode.Open))
        {
            imageData = new byte[fs.Length];
            fs.Read(imageData, 0, imageData.Length);
        }
		// передаем данные в команду через параметры
        command.Parameters["@FileName"].Value = shortFileName;
        command.Parameters["@Title"].Value = title;
        command.Parameters["@ImageData"].Value = imageData;

        command.ExecuteNonQuery();
    }
}

После выполнения этой программы в базе данных появится соответствующая запись:

Сохранение изображений в базе данных

Извлечение файлов из базы данных

В прошлой теме мы рассмотрели, как добавить файл в базу данных. Теперь произведем обратную операцию - получим файл из БД. Вначале определим класс файла, который упростит работу с данными:

public class Image
{
    public Image(int id, string filename, string title, byte[] data)
    {
        Id = id;
        FileName = filename;
        Title = title;
        Data = data;
    }
    public int Id { get; private set; }
    public string FileName { get; private set; }
    public string Title { get; private set; }
    public byte[] Data { get; private set; }
}

Затем в коде программы определим следующий метод:

private static void ReadFileFromDatabase()
{
    string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
	List<Image> images = new List<Image>();
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        string sql = "SELECT * FROM Images";
        SqlCommand command = new SqlCommand(sql, connection);
        SqlDataReader reader = command.ExecuteReader();

        while(reader.Read())
        {
            int id = reader.GetInt32(0);
            string filename = reader.GetString(1);
            string title = reader.GetString(2);
            byte[] data = (byte[])reader.GetValue(3);
            
			Image image = new Image(id, filename, title, data);
            images.Add(image);
        }
    }
	// сохраним первый файл из списка
    if(images.Count>0)
    {
        using (System.IO.FileStream fs = new System.IO.FileStream(images[0].FileName, FileMode.OpenOrCreate))
        {
            fs.Write(images[0].Data, 0, images[0].Data.Length);
            Console.WriteLine("Изображение '{0}' сохранено", images[0].Title);
        }
    }
}

В этом методе с помощью SqlDataReader мы получаем значения из БД и по ним создаем объект Image, который потом добавляется в список. И в конце смотрим, если в списке есть элементы, то берем первый элемент и сохраняем его на локальный компьютер. И после сохранения в папке нашей программы появится загруженный из базы данных файл.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850