Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.05.2008, 12:32
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию Blob-поля..

Добрый день уважаймые..у меня такой вопросс---как занести картинку в базу данных в блоб-поле через параметризованный запросс.Вот пример кода.Когда я захожу в интербейс.Подключаю свою базу и проверяю блоб поле--мне видаеть ошибка --ето не графический файл..Что делать .Помогите пожалуста..
Код:
 DM.IBQuery2.SQL.Clear;
DM.IBQuery2.SQL.Text:='insert into IMAGES(ID_IMAGES,NAME_1,NAME_2,NAME_3,IMG_1,IMG_2,IMG_3) values(:id,:a,:b,:c,:d,:e,:g);';
DM.IBQuery2.Params[0].AsInteger:=strtoint(edit1.text);
DM.IBQuery2.Params[1].AsString:=edit28.Text;
DM.IBQuery2.Params[2].AsString:=edit29.Text;
DM.IBQuery2.Params[3].AsString:=edit30.Text;
DM.IBQuery2.Params[4].AsBlob:=OpenPictureDialog1.FileName;
DM.IBQuery2.Params[5].AsBlob:=OpenPictureDialog2.FileName;
DM.IBQuery2.Params[6].AsBlob:=OpenPictureDialog3.FileName;
DM.IBTransaction1.Commit;
DM.IBQuery2.ExecSQL;

Admin: Не забываем использовать теги для оформления кода!

Последний раз редактировалось Admin, 17.05.2008 в 12:37.
Ответить с цитированием
  #2  
Старый 18.05.2008, 09:05
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

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

переменная типа TPicture,
- создается: Pct := TPicture.Create;
- в нее загружается изображение из файла:
Pct.LoadFromFile(OpenPictureDialog1.FileName);
Далее можно картинку сохранить в TMemoryStream (кстати, ее вообще можно загрузить и без TPicture: MemStream.LoadFromFile(OpenPictureDialog1.FileName )).
"Передвинуть" битовый образ картинки в String (проще будет передавать как параметр) и записать в базу.
Move(S[1], MemStream.Buffer, MemStream.Size);
DM.IBQuery2.Params[4].AsBlob:= S; //S : string;

Для работы с блоб полями можно воспользоваться специальным потоком для записи в блоб (и последующего чтения):
S := TBlobStream.Create(<FieldBlob1>, bmReadWrite)];

Последний раз редактировалось san-46, 18.05.2008 в 10:09.
Ответить с цитированием
  #3  
Старый 18.05.2008, 10:04
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию

по подробнее можна...
Ответить с цитированием
  #4  
Старый 18.05.2008, 10:17
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Что конкретно "подробнее"?
Ответить с цитированием
  #5  
Старый 18.05.2008, 11:27
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию

как ето реализовать..если можна то код...
Ответить с цитированием
  #6  
Старый 18.05.2008, 11:37
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию

вроде как работает:Всем большое пасибо
Stream1 := TMemoryStream.Create;
Stream1.Clear;
DBImage1.Picture.Bitmap.SaveToStream(Stream1);
Stream1.Position := 0;
for i := 1 to Stream1.Size do
begin
Stream1.Read(d, 1);
im := im+d;

end;

DM.IBQuery6.Params[4].AsBlob:=im;
Ответить с цитированием
  #7  
Старый 18.05.2008, 11:42
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Пример на одном файле с картинкой.

Код:
procedure AnyProc;
var 
  MemStream : TMemStream;
  S : String;
begin
  //открыть диалог и выбрать файл (без понятия как вы там эти картинки 
  //выбираете для записи в базу
  if not OpenPictureDialog1.Execute then Exit;
  MemStream := TMemStream.Create;
  try
    MemStream.LoadFromFile(OpenPictureDialog1.FileName));
    SetLength(S, MemStream.Size);
    Move(S[1], MemStream.Buffer, MemStream.Size);
    DM.IBQuery2.Params[4].AsBlob:= S;
  finally
    MemStream.Free
  end;
end;
Ответить с цитированием
  #8  
Старый 18.05.2008, 11:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А можно еще проще.

Код:
Stream := TMemoryStream.Create;
Try
  DBImage1.Picture.Bitmap.SaveToStream(Stream);
  Stream.Seek(0,0);
  DM.IBQuery6.Params[4].AsBlob.LoadFromStream(Stream);
Finally
  Stream.Free;
End;
Ответить с цитированием
  #9  
Старый 18.05.2008, 11:52
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Цитата:
Сообщение от Axotnik
Stream1.Position := 0;
for i := 1 to Stream1.Size do begin
Stream1.Read(d, 1);
im := im+d;
end;
А если файл 5-100 Мб? Скока он будет читаться в "im" по одному байту? Не профессионально.

У lmikle профессиональный вариант.

Последний раз редактировалось san-46, 18.05.2008 в 11:55.
Ответить с цитированием
  #10  
Старый 18.05.2008, 12:10
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию

извините но такого свойства как DM.IBQuery6.Params[4].AsBlob.LoadFromStream(Stream);
в делфи нету
Ответить с цитированием
  #11  
Старый 18.05.2008, 12:22
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию

а как записать большой текст из мемо в blob???
Ответить с цитированием
  #12  
Старый 18.05.2008, 13:12
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Да, действительно "AsBlob" определен как String и там не может быть декларированных свойств. Надо использовать String для образа картинки и передавать блоб полю. Как в моем посте выше.
Ответить с цитированием
  #13  
Старый 18.05.2008, 14:33
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Цитата:
Сообщение от Axotnik
а как записать большой текст из мемо в blob???
DM.IBQuery2.Params[4].AsBlob := Memo1.Text;
BLOB в БД должен быть определен как "подтип 1" - строка.
Впрочем, для текста это не очень существенно, но тем не менее...

Читаются из BLOB такие строки так:
S := DM.IBQuery2.FieldByName('SOMEFIELD').AsString;
Где "S" может быть и Memo1.Text;

Последний раз редактировалось san-46, 18.05.2008 в 14:38.
Ответить с цитированием
  #14  
Старый 18.05.2008, 16:42
Axotnik Axotnik вне форума
Прохожий
 
Регистрация: 16.10.2007
Сообщения: 10
Репутация: 10
По умолчанию

Извини САН-46 а что это за тип такой
MemStream : TMemStream;
Ответить с цитированием
  #15  
Старый 18.05.2008, 17:32
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Цитата:
Сообщение от Axotnik
а что это за тип такой
MemStream : TMemStream;
Прошу извинить. Конечно, надо TMemoryStream. Увлекся и не заметил, что опечатался.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter