Проблема с сохранением *.jpg в blob поле.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
SAN_i
Сообщения: 14
Зарегистрирован: 31 июл 2006, 19:24

Проблема с сохранением *.jpg в blob поле.

Сообщение SAN_i » 16 апр 2008, 01:46

На Delphi7 пишу программу(СУБД). Использую FireBird 1.5.

Есть у меня компонент на форме тип TImage.
Хочу из него фотографию сохрянить в blob поле моей базы данных.
Написал такой код (Stream : TClientBlobStream):

Код: Выделить всё

frmMain.IBClntDtStMain.Locate('ID',CurrentPeopleId,[loCaseInsensitive]);
frmMain.IBClntDtStMain.Edit;
frmMain.IBClntDtStMain.FetchBlobs;
Stream := TClientBlobStream.Create(TBlobField(frmMain.IBClntDtStMain.FieldByName('Photo')),
                bmWrite);
Stream.Position := 0;
Stream.Clear;
ImgPeople.Picture.Graphic.SaveToStream(Stream);
frmMain.IBClntDtStMain.Post;
frmMain.IBClntDtStMain.ApplyUpdates(0);
Stream.Free;
Проблема в том что данный код компелируется и никаких ошибок программа при использовании не выдаёт, но изображение в бд так и не появляется.

Подскажите в чем я ошибся, пожалуйста.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 апр 2008, 11:57

Ты его только создал, и дополнительно делаешь Clear и Position... Ну предположим.
А где управление транзакциями?
ApplyUpdates - это ты CDS с Cached Updates используешь что ли?

SAN_i
Сообщения: 14
Зарегистрирован: 31 июл 2006, 19:24

Сообщение SAN_i » 16 апр 2008, 16:59

WildSery писал(а):Ты его только создал, и дополнительно делаешь Clear и Position... Ну предположим.
А где управление транзакциями?
ApplyUpdates - это ты CDS с Cached Updates используешь что ли?
Cached Updates - не используется, просто гдето в нэте вычитал что при работе с blob полями просто выполнить Post мало, что нужно ещё и ApplyUpdates.

Насчёт Clear и Position... да наверное погорячился, попробывал без них и без ApplyUpdates, ситуация не изменилась.

О транзакциях както не подумал, попробую поковырять в этом направлении.

Спасибо за ответ.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 апр 2008, 18:14

Так, на всякий случай. Вот тут читал?

SAN_i
Сообщения: 14
Зарегистрирован: 31 июл 2006, 19:24

Сообщение SAN_i » 09 май 2008, 00:35

WildSery писал(а):Так, на всякий случай. Вот тут читал?
Прочитал. Полезно, спасибо за ссылку но мне не помогло :(.
Попробовал написать код наподобии того, что указан в примере, так тоже самое код выполняется без возникновения ошибок но когда смотрю данные через ibexpert поле попрежнему null.
Вот используемый мной код:

Код: Выделить всё

if OpnPctrDlgPhoto.Execute then
    begin
      frmMain.IBDataSet1.Open;
      frmMain.IBDataSet1.Edit;
        (frmMain.IBDataSet1.FieldByName('Photo') as     TBlobField).LoadFromFile(OpnPctrDlgPhoto.FileName);
      frmMain.IBDataSet1.Post;
    end;
В ModifySQL использовал такой запрос:

Код: Выделить всё

update PEOPLE
set
  PEOPLE.PHOTO = :PHOTO
where
  PEOPLE.ID_PEOPLE = :OLD_ID
Транзакция(хоть это и не правильно) открывается автоматически.
Тип blob поля 0.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 май 2008, 01:18

1. не верю.
2. commit делал?
3. после рестарта всего блоб так и не видно?

я удивляюсь, как люди умудряются писать кривой код при таких простых действиях, тем более описанных в FAQ
www.ibase.ru/devinfo/ibx.htm#blob
www.ibase.ru/ibfaq.htm#blob

еще замечу, что в faq и ibx.htm помещен 100% работающий код, который был специально проверен, перед тем как публиковать эти ответы на вопросы.

SAN_i
Сообщения: 14
Зарегистрирован: 31 июл 2006, 19:24

Сообщение SAN_i » 09 май 2008, 01:30

Код: Выделить всё

if OpnPctrDlgPhoto.Execute then 
    begin 
      if not frmMain.IBDataSet1.Transaction.Active then  
        frmMain.IBDataSet1.Transaction.StartTransaction;
      frmMain.IBDataSet1.Open; 
      frmMain.IBDataSet1.Edit; 
        (frmMain.IBDataSet1.FieldByName('Photo') as 
          TBlobField).LoadFromFile(OpnPctrDlgPhoto.FileName); 
      frmMain.IBDataSet1.Post; 
      frmMain.IBDataSet1.Transaction.Commit;
    end;
Вот так я пробовал с commit. Результат прежний. Как то умудрился написать, вот только не пойму как, а хотелось бык...

SAN_i
Сообщения: 14
Зарегистрирован: 31 июл 2006, 19:24

Сообщение SAN_i » 09 май 2008, 01:44

Толькочто походу разобрался, проблема вроде с указанием ключа таблицы. В ближайшее время розберусь и выложу рабочий вариант.

Спасибо WildSery и kdv за помощ.

ЗЫ: всётаки http://www.ibase.ru/devinfo/ibx.htm#blob помогло.

SAN_i
Сообщения: 14
Зарегистрирован: 31 июл 2006, 19:24

Сообщение SAN_i » 12 май 2008, 19:32

Вобщем так у меня работает:

Код: Выделить всё

  if OpnPctrDlgPhoto.Execute then begin
    if not frmMain.IBDataSet1.Transaction.Active then
      frmMain.IBDataSet1.Transaction.StartTransaction;
    ImgPeople.Picture.LoadFromFile(OpnPctrDlgPhoto.FileName);
    frmMain.IBDataSet1.Open;
    frmMain.IBDataSet1.First;
    while frmMain.IBDataSet1.FieldByName('ID').AsInteger <> CurrentPeopleId do
       frmMain.IBDataSet1.Next;
    frmMain.IBDataSet1.Edit;
    (frmMain.IBDataSet1.FieldByName('Photo') as TBlobField).LoadFromFile(OpnPctrDlgPhoto.FileName);
    frmMain.IBDataSet1.Post;
    frmMain.IBDataSet1.Transaction.Commit;
    if not frmMain.IBDataSet1.Transaction.Active then
      frmMain.IBDataSet1.Transaction.StartTransaction;
    frmMain.DataUpd;
  end;

Ответить