Как и обещал поговорим о том, как еще одним способом можно добавить картинки в БД, да и не только картинки в любую БД. Добавление файлов в любую БД это громко сказано, конечно, мы как бы формально будем хранить эти файлы, а если быть еще более точным, или более понятным, то мы будем просто копировать файлы в определенную папку, а в БД хранить только лишь их названия. Да от этого программа или наше приложение будет «весить» еще больше, то есть будет занимать больше места на диски и с добавлением новых файлов постепенно увеличиваться, но и если в базу добавлять файлы будет не программа увеличиваться, а уже сама БД, конечно БД сжимает файлы до какого-то объема, но не на столько много. Да и хорошо, что если БД будет какая-нибудь сетевая, то Вам придется на сервере объем жесткого диска увеличивать, если будете добавлять данные в БД, а если БД локальная, то, что добавление данных в БД, что хранения названий файлов в БД, и копирование их в отдельную папку будет носить почти тот же характер. Только с БД будет удалить файл сложнее, чем например из папки.
Возьмем за пример любую БД. Я возьму тот же MS Access по технологии ADO. Подключать мы уже умеем данную БД в Delphi. Делаем подключение и создаем там какое-нибудь текстовое поле. На форме у нас находиться
- TImage
- TButton — 2 шт
- TOpenDialog
- TAdoQuery
- TAdoConnection
Ну думаю хватит, если что-то забыли, то походу все сделаем. БД у нас готова, таблица называется в БД Files. Пусть так, думаю тут ничего придумывать не надо. Также в корне папки с нашей программой (приложением) создадим папку files. На примерt jpg-картинок посмотрим как добавлять таким способом данные в БД.
Для начала как всегда активируем наш AdoQuery, и поэтому на OnCreate нашей главной формы напишем это
procedure TForm1.FormCreate(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Files');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;
Далее на Button1 событие OnClick пишем (это у нас формальное добавление данных)
procedure TForm1.Button1Click(Sender: TObject);
begin
try
if OpenDialog1.Execute then
begin
ADOQuery1.Insert;
ADOQuery1.FieldByName('namefiles').AsVariant:=ExtractFileName(OpenDialog1.FileName);
CopyFile(Pchar(OpenDialog1.FileName),Pchar(ExtractFilePath(Application.ExeName)+'\files\'+ExtractFileName(OpenDialog1.FileName)),true);
ADOQuery1.Post;
end;
except
on e:Exception do
end;
end;
Поясню, что мы тут делаем такого необычного, просто вставляем имя нашего файла в БД, и копируем файл в папку files с помощью CopyFile.
У данной функции следующие параметры
- путь файла, который копируем
- путь к файлу, куда сохраняем
- флаг
Здесь думаю проблем возникнуть не должно. Далее мы считываем из БД имя нашего файла и выводим jpg-картинку в наш TImage. Это примерно будет выглядеть так
procedure TForm1.Button2Click(Sender: TObject);
begin
try
ADOQuery1.First;
if (Trim(ADOQuery1.FieldByName('namefiles').AsString)='')
or (FileExists('files\'+ADOQuery1.FieldByName('namefiles').AsString)=False) then
begin
exit;
end;
Image1.Picture.LoadFromFile('files\'+ADOQuery1.FieldByName('namefiles').AsString);
except
on e:Exception do
end;
end;
То есть, ставим указатель на первую запись, читаем имя файла и просто загружаем его в TImage. Как видите данные в БД не хранятся, и поэтому БД будет не большой по размеру, но зато каталог с программой будет занимать приличное место, если конечно будет много объемных файлов.
Это можно применять во всех БД, думаю, что все понятно.