Страница 1 из 1

Как вставить картинку jpg в базу ms access 2003 из Lazarus

СообщениеДобавлено: 29.01.2013 23:52:38
Ism
Потратил на решение много времени, нормальных средств нет, есть только такие хаки

Код: Выделить всё
var
  aJpg:TJPEGImage; 
  InBMP: TBitmap;
begin
  aJpg :=TJPEGImage.Create;
  InBmp := TBitmap.Create;
  aJpg.LoadFromFile(SysToUTF8('c:\test.jpg');
  aJpg.CompressionQuality:=100;
  InBmp.PixelFormat:=pf24bit;
  InBmp.Assign(aJpg);
  SavePictureToDB(InBmp,TBlobField(SQLQueryPictBase.FieldByName('picture')));


Сама процедура
Код: Выделить всё
procedure SavePictureToDB(p:TBitmap;blob_field_stream:TBlobField);
var str,strb:TMemoryStream;
    h:longint;
    hb:array [1..4] of byte;
    i:integer;
const
head1=#21#28#51#0#2#0#0#0#17#0#14#0#20#0#37#0;
head2='яяяяТочечный рисунок'#0'Paint.Picture';
head3=#0#1#5#0#0#2#0#0#0#7#0#0#0;
head4='PBrush'#0#0#0#0#0#0#0#0#0;
tail1=#0#0#0#0#0#0#0#0;
tail2=#0#0#1#5#0#0#0#0#0#0#0#173#5#254;
begin
   str:=TMemoryStream.Create;
   strb:=TMemoryStream.Create;
   p.SaveToStream(strb);
   str.Write(head1,16);
   str.Write(head2,34);
   str.Write(head3,13);
   str.Write(head4,15);
   h:=strb.Size+26;
   for i:=1 to 4 do begin
     hb[i]:=h mod 256;
     h:=h div 256;
   end;
   str.Write(hb,4);
   strb.Seek(0,soFromBeginning);
   str.CopyFrom(strb,strb.Size);
   str.Write(tail1,8);
   str.Write(tail1,8);
   str.Write(tail1,8);
   str.Write(tail2,14);
   strb.Seek(0,soFromBeginning);
   blob_field_stream.LoadFromStream(str);
   strb.Free;
   str.Free;
end;

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 30.01.2013 00:46:52
alexs
Код: Выделить всё
      Image1.Picture.Jpeg.SaveToStream(MS);

А почему нельзя через этот метод?
А уже поток можно куда хочешь сохранить, в том числе и в поле БД...

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 30.01.2013 01:42:11
Ism
alexs писал(а):
Код: Выделить всё
      Image1.Picture.Jpeg.SaveToStream(MS);

А почему нельзя через этот метод?
А уже поток можно куда хочешь сохранить, в том числе и в поле БД...

Не, в access , как во всех извращенных системах картинка не блоб, а определенная структура, которая работает только в Ms Office
Формы access воспроизводят только это

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 30.01.2013 02:47:24
alexs
В смысле там хранится не бинарное представление обычного jpg а какой-то свой формат?

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 30.01.2013 03:05:55
Ism
alexs писал(а):В смысле там хранится не бинарное представление обычного jpg а какой-то свой формат?

Там какаято разновидность bmp , но своя, так что обычный bmp не работает , нужен еще заголовок

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 30.01.2013 21:04:43
alexs
Может они OLE хранилище используют?
Все офисные документы до 2007 офиса именно в нём хранились
Внутри это типа файловой системы

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 30.01.2013 21:10:15
Padre_Mortius
Там именно OLE-объекты и хранятся

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 31.01.2013 02:17:51
alexs
На этот случай можно использовать библиотеки которые с ним работают. Например - в fpspreadsheet есть соответсвующие модули.

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 09.08.2013 13:02:20
naomika
Через поток можно реализовать

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 09.08.2013 13:11:15
vada
Не понял! В Accesse-е действительно нет поля с двоичными данными. :(
Ну... можно байтовый поток конвертнуть ну хоть в 16-ти ричное текстовое представление и в текстовое поле засунуть. Потом назад тем же макаром.
ЗЫ. В PostgreSQL я JAVA классы хранил. DOM. Только легкие проблемы сериализации.

Re: Как вставить картинку jpg в базу ms access 2003 из Lazar

СообщениеДобавлено: 09.08.2013 16:01:16
Ism
vada писал(а):Не понял! В Accesse-е действительно нет поля с двоичными данными. :(
Ну... можно байтовый поток конвертнуть ну хоть в 16-ти ричное текстовое представление и в текстовое поле засунуть. Потом назад тем же макаром.
ЗЫ. В PostgreSQL я JAVA классы хранил. DOM. Только легкие проблемы сериализации.

Все есть, но блоб не будет отображаться в самом Access, поэтому такие извращения