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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.09.2010, 13:25
eldaeron eldaeron вне форума
Прохожий
 
Регистрация: 05.05.2008
Сообщения: 15
Репутация: 10
По умолчанию сохранение blob на диск

Доброго времени суток!
такая проблема, есть dataset, в нем одно поле и оно есть blob с картинкой (gif).
картинку надо сохранить на диск.
если делать так
Код:
procedure TestMacroProc (MName:string; AParams:TObject);
var 
  FS: TFileStream; 
  wPrm:TmParams;
  ds:Tdataset;
  buffer:Variant;
  buf:TBlobByteData;
  zap:string;
  s:string;
begin
  img:=Timage.create(nil);
  wPrm:=AParams as TmParams;
  zap:='select image from dent_teeth_map where map_id='+wPrm.Values[0];
  ds:=CreateSQLDataset(zap,true);
  ds.Open;
    buffer:=ds.GetBlobFieldData(1,buf);
    FS:=TFileStream.Create('c:\1.gif', fmCreate); // создаем файл
    with FS do
    try
       Seek(0, soFromBeginning); // перемещаем указатель в начало потока
       WriteBuffer(buf, buffer);// записываем целое
       finally
       Free; // закрываем файл, освобождаем память
    end;
  ds.close;
end; 
то файл создается. по длине он совпадает с исходным файлом(который грузился в базу) но вот по содержимому он совершенно другой и как следствие это уже получается не картинка а файл с мусором
Ответить с цитированием
  #2  
Старый 09.09.2010, 17:53
eldaeron eldaeron вне форума
Прохожий
 
Регистрация: 05.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

вот, если вдруг надо кому...
Код:
procedure TestMacroProc (MName:string; AParams:TObject);
var 
  wPrm:TmParams;
  ds:Tdataset;
  zap:string;
  bl:TBLObfield;

begin
  wPrm:=AParams as TmParams;
  if wPrm.Values[1]=1 then zap:='select image from dent_teeth_map where map_id='+wPrm.Values[0]
  else zap:='select template from templates where id=747';
  ds:=CreateSQLDataset(zap,true);
  bl:= ds.fields[0] as tblobfield;
  if wPrm.Values[1]=1 then bl.savetofile('c:\1.gif')
  else bl.savetofile('c:\1.txt');
end;

creatdataset это нестандартная процедура, но если вы сможете сделать свой то это прокатит)

Последний раз редактировалось eldaeron, 09.09.2010 в 18:01.
Ответить с цитированием
  #3  
Старый 09.09.2010, 20:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что, бросить на формочку один раз компонент и просто указывать ему свойство SQL нельзя??? можно даже 2 бросить и просто выбирать нужный.

А так у тебя память течет - ты создаешь источник данных, но в конце процедуры его не освобождаешь. А про методы чиения/сохранения содержимого BLOB полей в поток/файл вообще-то написано в документации.
Ответить с цитированием
  #4  
Старый 14.09.2010, 07:19
eldaeron eldaeron вне форума
Прохожий
 
Регистрация: 05.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

фишка как раз в том что формочки никакой нет, это кусок макроса (причем тренировачный, чтоб понять схему работы) В макрос приходят имя_пакта.имя_процедуры в бд и параметры, он делает датасет и сохраняет полученное на диск ораклом конечно тоже можно выгружать, но только на диск сервера. ложить сервером на паку клиента не вариант. а про про освобождение да ты прав, совсем забыл
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter