Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 13.11.2007, 19:55   #1
chekanoff
Пользователь
 
Аватар для chekanoff
 
Регистрация: 13.11.2007
Сообщений: 81
Вопрос ФОТО из Delphi в БД MySQL

Пишу БД на Delphi! Все нормально выходит! Но есть одна проблема: даже не представляю как сохранять фотки в БД MySQL! Помогите процедуркой и методикой! Заранее спасибо!!!
Лучшее образование - самообразование (В.Пикуль)
chekanoff вне форума Ответить с цитированием
Старый 13.11.2007, 21:47   #2
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

используй вот такой код
раньше писал для себя
Код:
unit uJobFieldBlob;

interface

uses jpeg, Classes, Graphics, DB, SysUtils;

  function GetStreamImgType(Stream: TStream): TClass;
  procedure LoadProperImage(Stream: TStream; Picture: TPicture);
  function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
  procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
implementation

function GetStreamImgType(Stream: TStream): TClass;
var
  StreamPos: int64;
  ImgSign: string;
begin
  StreamPos := Stream.Position;
  try
    //BMP если не определено
    Result := Graphics.TBitmap;
    //JPEG
    SetLength(ImgSign, 4);
    Stream.Seek(6, soFromCurrent);
    Stream.Read(ImgSign[1],4);
    if (UpperCase(ImgSign) = 'JFIF') or (UpperCase(ImgSign) = 'EXIF') then
      Result := Jpeg.TJPEGImage;
    //WMF
    Stream.Position := StreamPos;
    SetLength(ImgSign, 4);
    Stream.Read(ImgSign[1],4);
    if ImgSign = #$D7#$CD#$C6#$9A then
      Result := Graphics.TMetafile;
  finally
    Stream.Position := StreamPos;
  end;
end;

procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
  Img: TGraphic;
  StreamPos: int64;
begin
  StreamPos := Stream.Position;
  Img := TGraphicClass(GetStreamImgType(Stream)).Create;
  try
    Stream.Position := StreamPos;
    Img.LoadFromStream(Stream);
    Picture.Graphic := Img;
  finally
    Img.Free;
  end;
end;

function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
  Stream: TStream;
begin
  Result := False;
  if not Field.isNULL then
  begin
    Stream := TMemoryStream.Create;
    try
      Field.SaveToStream(Stream);
      Stream.Position := 0;
      LoadProperImage(Stream, Picture);
      Result := True;
    finally
      Stream.Free;
    end;
  end;
end;

procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
  Stream: TStream;
begin
  if not (Field.DataSet.State in [dsEdit, dsInsert]) then
    Field.DataSet.Edit;
  Field.Clear;
  if Assigned(Picture.Graphic) then
    if not Picture.Graphic.Empty then
      begin
        Stream := TMemoryStream.Create;
        try
          Picture.Graphic.SaveToStream(Stream);
          Stream.Position := 0;
          Field.LoadFromStream(Stream);
        finally
          Stream.Free;
        end;
      end;
end;

end.
всё работает 100%
dron-s вне форума Ответить с цитированием
Старый 13.11.2007, 22:03   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Я для кадровой программы, правда, в интербейсе, делал проще:
Код:
IBTFoto.FieldByName('FOTO').BlobType:=ftGraphic;
//DBImage1 подцеплено к этому же полю FOTO
DBImage1.Picture.Assign(Image1.Picture);
Application.ProcessMessages;
IBTFoto.Post;
Может, и для мускула подойдет?
mihali4 вне форума Ответить с цитированием
Старый 13.11.2007, 22:12   #4
chekanoff
Пользователь
 
Аватар для chekanoff
 
Регистрация: 13.11.2007
Сообщений: 81
По умолчанию

Большое спасибо! Буду пробовать!
Лучшее образование - самообразование (В.Пикуль)
chekanoff вне форума Ответить с цитированием
Старый 13.11.2007, 22:36   #5
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

а можно и так сделать
Код:
IBTransaction1.StartTransaction;
        IBTable1.Open;
        spDoc_Write.ParamByName('NAME_DOC').AsString := sr.Name;
        spDoc_write.ParamByName('file_doc').LoadFromFile(path+sr.Name, ftBlob);
        IBTable1.Next;
        try
          spDoc_Write.ExecProc;
          spDoc_write.Transaction.Commit;
        except
          spdoc_write.Transaction.Rollback;
          showmessage('хрен! не могу записать!!!');
          abort;
        end;
параметры передаются в хранимку..
сама хранимка выглядит так
Код:
SET TERM ^ ;

CREATE OR ALTER PROCEDURE WRITE_DOC_FILE (
    name_doc varchar(1000),
    file_doc blob sub_type 0 segment size 10000)
as
declare variable id_count integer;
begin
  if (:name_doc is null) then name_doc = '_';

  id_count = gen_id(gen_document_id,1);

  insert into document (id_doc, name_doc, file_doc)
  values (:id_count, :name_doc, :file_doc);
end^

SET TERM ; ^

GRANT INSERT ON DOCUMENT TO PROCEDURE WRITE_DOC_FILE;

GRANT EXECUTE ON PROCEDURE WRITE_DOC_FILE TO SYSDBA;
так проще получается ...
написано для примера

Последний раз редактировалось dron-s; 13.11.2007 в 22:38.
dron-s вне форума Ответить с цитированием
Старый 15.11.2007, 00:14   #6
chekanoff
Пользователь
 
Аватар для chekanoff
 
Регистрация: 13.11.2007
Сообщений: 81
По умолчанию

как это может получиться если я обращаюсь к БД через SQL запросы????

если перефразировать вопрос: как конкретное фото с конкретным путем загнать в поле БД MySQL типа BLOB!!!!

есть же способы проще?????


жирным писать не надо
p.s.: есть кнопка редактировать
Лучшее образование - самообразование (В.Пикуль)

Последний раз редактировалось Alex21; 15.11.2007 в 07:54.
chekanoff вне форума Ответить с цитированием
Старый 15.11.2007, 00:44   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от chekanoff Посмотреть сообщение
есть же способы проще?????
Да вроде проще, чем я вам предложил, нету.
Вы хоть попробовали?
mihali4 вне форума Ответить с цитированием
Старый 15.11.2007, 04:54   #8
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

Цитата:
как это может получиться если я обращаюсь к БД через SQL запросы????
слушай, а чем тебя пост номер пять не устроил?
или ты посмотрел что там много буковок и сделал вывод что он не работает или он не подходит для тебя?
Цитата:
как конкретное фото с конкретным путем загнать в поле БД MySQL типа BLOB!!!!
мой примерно именно это и делает
dron-s вне форума Ответить с цитированием
Старый 16.11.2007, 10:11   #9
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
По умолчанию

Сори вот
Код:
var
  LStrem:TStringStream;
begin
  LStrem:=TStringStream.Create('C:\picture.jpg');
  with ADOQuery1 do
    begin
      Parameters.ParamByName('Photo').Value:=LStrem.DataString;
      ExecSQL;
    end;
end;
Вот как можно обойтись без потока
Код:
var
filename:string;
begin
FileName:='C:\1.jpg';
ADOQuery2.Parameters.ParamByName('photo').LoadFromFile(FileName,ftBlob);
ADOQuery2.ExecSQL;
end;
Здесь перем photo соответ типа ftblob. А запрос в Adoquery2 следующий
Код:
insert into Photo(photo) values(:photo)

Последний раз редактировалось Alex21; 06.12.2007 в 15:06.
Domovoy вне форума Ответить с цитированием
Старый 16.11.2007, 20:07   #10
chekanoff
Пользователь
 
Аватар для chekanoff
 
Регистрация: 13.11.2007
Сообщений: 81
По умолчанию

Это выглядит проще! Буду пробовать!

Всем большое спасибо за помощь! Сохранять получилось! Вот вопрос теперь в том, как фото отобразить в DBImage, ведь фото сохранено в поле типа Blob?????????
Зарание спасибо!
Лучшее образование - самообразование (В.Пикуль)

Последний раз редактировалось Alex21; 06.12.2007 в 15:05.
chekanoff вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
mySQL+DELPHI от и до shuhermayer SQL, базы данных 21 20.10.2011 20:22
Связать Mysql c Delphi kiber0net0 Помощь студентам 4 02.09.2008 22:44
Delphi + удаленный MySQL Viteef БД в Delphi 5 30.05.2008 14:27
MySQL и Delphi, проблема... POPOV SQL, базы данных 1 28.12.2007 08:03
MySQL+Delphi Toxa Общие вопросы Delphi 3 23.01.2007 18:24


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS