Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > OLE из BLOB


Автор: Spike 5.7.2006, 09:20
Привет всем!
Может кто знает как загрузить данные из BLOB-поля в OLEContainer?
Доступ к данным осуществляется через TADOQuery. 

Автор: Vit 5.7.2006, 16:38
ADOQuery имеет возможность чтения поля в поток Stream, а то чего у вас там в контейнере должно понимать работу с потоками, или иметь какие-то методы для работы с данными. Вообще-то вопрос достаточно странный, типа: " у меня есть мешок, как мне включить то что находится в мешке?" - ответ, "а хрен его знает" - зависит от того что засунуто в мешок... Контейнер он и есть контейнер, а реальная функциональность его содержимого зависит от самого содержимого. 

Автор: Spike 6.7.2006, 11:32
Цитата(Vit @  5.7.2006,  16:38 Найти цитируемый пост)
ADOQuery имеет возможность чтения поля в поток Stream

ADOQuery имеет возможность чтения в поток TADOBLOBStream

Цитата(Vit @  5.7.2006,  16:38 Найти цитируемый пост)
а то чего у вас там в контейнере должно понимать работу с потоками, или иметь какие-то методы для работы с данными

TOLEContainer умеет работать с потоками типа TStream, а также умеет загружать данные из файлов, но опять же через TFileStream

Цитата(Vit @  5.7.2006,  16:38 Найти цитируемый пост)
 у меня есть мешок, как мне включить то что находится в мешке?" - ответ, "а хрен его знает" - зависит от того что засунуто в мешок... Контейнер он и есть контейнер, а реальная функциональность его содержимого зависит от самого содержимого.

Именно так, вопрос не в том как запустить (включить) содержимое, вопрос в том, как это содержимое правильно поместить/ загрузить в контейнер (т.е. сделать данные из БД содержимым контейнера).

Почему-то TADOBLOBStream и TStream имеют различный формат (насколько я понял)... smile Вот здесь и нужен хелп!!! 

Автор: Vit 6.7.2006, 15:22
Цитата(Spike @  6.7.2006,  02:32 Найти цитируемый пост)
ADOQuery имеет возможность чтения в поток TADOBLOBStream


Цитата(Spike @  6.7.2006,  02:32 Найти цитируемый пост)
TOLEContainer умеет работать с потоками типа TStream, а также умеет загружать данные из файлов, но опять же через TFileStream



Все они  наследники TStream


Цитата(Spike @  6.7.2006,  02:32 Найти цитируемый пост)
Именно так, вопрос не в том как запустить (включить) содержимое, вопрос в том, как это содержимое правильно поместить/ загрузить в контейнер (т.е. сделать данные из БД содержимым контейнера).


Ну теперь то задача хоть понятна

Цитата(Spike @  6.7.2006,  02:32 Найти цитируемый пост)
Почему-то TADOBLOBStream и TStream имеют различный формат (насколько я понял)...  Вот здесь и нужен хелп!!!  



Формат самих данных одинаков, они оба наследуются от одного предка. На вскидку, если проблема только в этом, то можно просто иметь 2 потока и копировать из одного в другой. А если не на вскидку, то TOLEContainer имеет метод LoadFromStream который требует абстрактный TStream, а значит будет принимать любого потомка TStream, в том числе и TADOBLOBStream 

Автор: Spike 7.7.2006, 10:00
Цитата(Vit @  6.7.2006,  15:22 Найти цитируемый пост)
А если не на вскидку, то TOLEContainer имеет метод LoadFromStream который требует абстрактный TStream, а значит будет принимать любого потомка TStream, в том числе и TADOBLOBStream 

Это в теории, а на практике следующий код не работает:
Код

...
d: TADOBLOBStream;
...
d:=TADOBLOBStream.Create((ADOQuery1.FieldByName('Blob') as TBlobField), bmRead);
OleContainer1.LoadFromStream(d as TStream);

и еще раз, повторюсь, из-за различного формата данных. 

Автор: Golden Hands 8.7.2006, 01:47
Spike, грузи поток либо в визуальный TImage, либо в TBitmap для дальнейших действий. 

Автор: Spike 10.7.2006, 10:44
Цитата(Golden Hands @  8.7.2006,  01:47 Найти цитируемый пост)
Spike, грузи поток либо в визуальный TImage, либо в TBitmap для дальнейших действий. 

Не понял..., причем тут TImage и/или TBitmap?
 

Автор: Golden Hands 11.7.2006, 00:31
Для чего тебе загружать в  OLEContainer? 

Автор: Spike 11.7.2006, 10:27
Golden Hands, а разве в BLOB можно хранить только картинки? я вот хочу хранить там документы word, excell, да и вообще любые... Вот и нужен для этого TOLEConteiner. Конечно, это может быть в корне не верный подход smile , я не знаю, кто знает лучше, я буду благодарен... Хранить в файлах - тоже вариант, но вынужденный (при этом, возможно не худший). 

Автор: Golden Hands 11.7.2006, 22:32
Напиши уже наконец, какую СУБД используешь.
MS Access поди?  smile  

Автор: Spike 12.7.2006, 08:31
Цитата(Golden Hands @  11.7.2006,  22:32 Найти цитируемый пост)
Напиши уже наконец, какую СУБД используешь.
MS Access поди?     

Блин, забыл  smile  - ее родимую. Вот и хочу сделать такую возможность как в access'е: скопировал в буффер обмена кусок текста вордовского, или файл с картинкой или ..., вставил в ячейку, а потом когда надо запустил. Ведь умеет же access это делать - значит есть путь smile  

Автор: Golden Hands 13.7.2006, 00:01
Если данные заносились через MS Access, то смотри тут:
http://forum.shelek.com/index.php?action=printpage;topic=7620.0
http://www.sql.ru/forum/actualthread.aspx?bid=40&tid=240912

Проблема заключается в получении "чистого" формата файла, то есть отсекании "левой" инфы, которую пихает Access. Например, для BMP-изображений:
Код

b:=TAdoBlobStream.Create(TBlobField(AdoDataSet1.FieldByName('<name>')), bmRead);
b.Seek(82, soFromBeginning);
...


А вот какую поправку делать на остальные форматы файлов - известно наверное только Microsoft.


А загрузку в OleContainer "чистого" файла тоже не смог реализовать... 

Автор: Spike 13.7.2006, 09:03
Цитата(Golden Hands @  13.7.2006,  00:01 Найти цитируемый пост)
http://forum.shelek.com/index.php?action=p...ge;topic=7620.0

ОНО smile 
т.е. по идее записав в blob-поле чистый файл, он должен запуститься без проблем, надо попробовать... 

Автор: DDX 13.7.2006, 10:20
Spike, 

загрузка в BLOB- поле  MSAccess ( поле q_blob таблицы adtQuestion) из OLEContainer (oleQuestion)
Код

var
        s: tmemorystream;
begin
with form1 do begin
        if adoconnection1.connected then begin
                try
                        if oleQuestion.State=osempty then exit;
                        adtQuestion.Edit;
                        s:=tmemorystream.create;
                        oleQuestion.SaveToStream(s);
                        if s.size>0 then  begin
                                adtQuestionq_blob.LoadFromStream(s) ;
                                adtQuestion.Post;
                        end
                finally
                        s.free;

                end
        end
end


загрузка содержимого BLOB-поля в OLEContainer
Код

procedure LoadQuestionFromBLOB;
var
bs:tadoblobstream;
begin
with form1 do begin
if adoConnection1.connected then begin
try
bs:=TADOBLOBStream.Create(adtQuestionQ_blob, bmread);

if bs.size>0 then begin
        oleQuestion.LoadFromStream(bs);
        ...
finally 
   bs.free;
end;

 

Автор: Spike 17.7.2006, 14:30
сделал так:
Код

procedure TForm1.Button2Click(Sender: TObject);
var
   ms: TMemoryStream;
begin
   try
      if OLEContainer1.State=osEmpty then exit;
      ADOTable1.Edit;
      ms:=TMemoryStream.Create;
      OLEContainer1.SaveToStream(ms);
      if ms.size>0 then  begin
         (ADOTable1.FieldByName('blob') as TBLOBField).LoadFromStream(ms);
         ADOTable1.Post;
      end;
   finally
      ms.free;
   end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
   abs: TADOBLOBStream;
begin
   try
      abs:=TADOBLOBStream.Create(ADOTable1.FieldByName('blob') as TBlobField, bmread);
      if abs.size>0 then begin
        OLEContainer1.LoadFromStream(abs);
      end;
   finally
      abs.free;
   end;
end;  

работает.
Спасибо всем!

Но вопрос с микрософтовским форматом не снимается, если кто встретит - киньтесь ссылкой. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)