Запись данных в поле Blob (Delphi)

09.08.2010
В этой небольшой статье, я хотел бы задеть тему Blob полей. Эти поля необходимы для хранения файлов, но многие программисты (а в частности веб-мастера) используют БД не для хранения самих файлов, а для хранения ссылки на них. С одной стороны такой способ удобен, ведь в таком случае мы можем получить быстрый доступ ко всем файлам. Но с другой стороны у Blob полей есть ряд преимуществ:
1) При удалении записи из БД, удаляется и сам файл.
2) Не надо переименовывать файл (когда все файлы лежат в одной папке, им определённо нужны уникальные имена).
3) Ограничение прав доступа, наложенных с помощью БД действуют и на файлы.
И ещё маленькая тележка небольших достоинств.

Стоит признаться я и сам при написании сайтов все картинки (для статей, новостей), хранил в отдельной папке. Насчёт хранения файлов в самой БД я даже и не заморачивался, пока однажды не понадобилось написать приложение на связке MySQL и Delphi.
Найти оптимальный и лёгкий способ оказалось довольно сложно. Просидев конец рабочего дня и пару часов дома я ни нашёл ничего интересного об объёкте TBlobField. В итоге всё таки получилось создать рабочий кусок кода, и как самое главное, я считаю, довольно компактный.
Итак, первый пример у нас будет с использованием компонента ZEOS.
Как установить ZeosDBO можно прочитать здесь: "Установка Zeos".
Создайте новый проект и добавить на форму кнопку, OpenPictureDialog, ZQuery и ZConnection. Настройте ZConnection и ZQuery, создайте процедуру OnClick для кнопки и добавьте в неё следующие.

OpenPictureDialog1.Execute;

ZQuery1.SQL.Text := 'SELECT * FROM `user` WHERE `user_id` = "15"';
ZQuery1.Active := true;
ZQuery1.Edit;
(ZQuery1.FieldByName('foto') as TBlobField).LoadFromFile(OpenPictureDialog1.FileName);
ZQuery1.Post;

А теперь разберём этот небольшой код.
Первая строчка вызывает окно выбора файла, который мы хотим сохранить в БД. Во второй строчке указываем SQL запрос, результатом этого запроса будут записи, в которые далее мы запишем выбранный файл. В данном случае это будет запись пользователя (user) с идентификатором (user_id) равным 15. В третьей и четвёртой строчках мы активируем компонент запросов (ZQuery1) и указываем что сейчас мы будем изменять данные.
Самое интересное начинается в строке под номером 5, здесь мы указываем что поле БД `foto`, не что иное как Blob поле (ZQuery1.FieldByName('foto') as TBlobField) и загружаем в него ранее выбранный файл LoadFromFile(OpenPictureDialog1.FileName).
А последняя строчка указывает что редактирование завершено и данные можно изменить.