Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 23:14   #1
athleet
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 22
По умолчанию Добавление изображения в blob через sql. Blob пустой.

Здравствуйте.

Нужно сделать так, чтобы через sql в базу interbase добавлялось изображение .bmp вместе со всей записью. Но после добавления записи поле blob остается пустым.



Кнопка для выбора изображения:
Код:
sOpenPictureDialog1.Filter:='Bitmap picture (bmp)|*.bmp';
 IF sOpenPictureDialog1.Execute then begin
 sEdit11.Text:=ExtractFilePath(Application.ExeName) + 'img\' + ExtractFileName(sOpenPictureDialog1.FileName);
Кнопка сформировать запрос (в нашей бд запросы сначало записываются в листбокс, а потом исполняются кнопкой "выполнить запрос"):

Код:
3:begin


        Zapros:=Zapros
      +#39+sEdit7.Text+#39+','
      +#39+sEdit8.Text+#39+','
      +#39+sEdit9.Text+#39+','
      +#39+sEdit10.Text+#39+','
      +':foto' + ','
      +#39+sEdit12.Text+#39+')';



IF sEdit11.Text<>'' THEN  begin

       DataModule2.IBQuery5.Params.CreateParam(ftGraphic,'foto',ptInput);

DataModule2.IBQuery5.Params.ParamByName('foto').LoadFromFile(sEdit11.Text, ftGraphic);
             end;
Изначально вместо ftGraphic стоял ftBlob, экспериментировал.
Zapros:
Код:
Zapros := 'INSERT INTO ' + TBL + ' Values(';
Выполнение:
Код:
WITH DataModule2.IBQuery5 do begin
  SQL.Clear; SQL:=sListBox1.Items;
  ExecSQL;
Есть еще момент. Вот здесь идет запрос через свободный IBQuery5.
Код:
 DataModule2.IBQuery5.Params.CreateParam(ftGraphic,'foto',ptInput);
DataModule2.IBQuery5.Params.ParamByName('foto').LoadFromFile(sEdit11.Text, ftGraphic);
А если указать IBQuery4, который соответствует таблице, куда добавляется запись - выскакивает ошибка

Последний раз редактировалось athleet; 18.04.2012 в 23:25.
athleet вне форума Ответить с цитированием
Старый 19.04.2012, 07:55   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Запись картинки, находящейся в TImage в BLOB (jpeg или bmp)
Код:
procedure Form1.Save;
var
  Ss  : TStringStream;
  St : string;
  jpg: TJpegImage;
begin
  IBQuery1.SQL.Text :=
       'update catalog set '+        //или INSERT, но запрос параметризированый 
            <...>
            'Pict = :Pict, Typ = :Typ,'+   //Pict - поле BLOB (тип не важен)
            'where ID = '+ IntToStr(IDc);

  if (Image1.Picture.Graphic <> nil) and not Image1.Picture.Graphic.Empty
  then begin
    Ss := TStringStream.Create(st);
    if Image1.Picture.Graphic is TJpegImage then begin
      jpg := TJpegImage.Create;
      jpg.Assign(image1.picture.graphic);
      jpg.CompressionQuality := 100;
      jpg.SaveToStream(Ss);
      jpg.Free;
      IBQuery1.ParamByName('typ').AsSmallInt := 1; //1 - jpeg, 0 - bmp
    end else begin
      Image1.Picture.Bitmap.SaveToStream(Ss);
      IBQuery1.ParamByName('typ').AsSmallInt := 0;
    end;
    IBQuery1.ParamByName('Pict').AsBlob := Ss.DataString;
    Ss.Free;
  end else
    IBQuery1.ParamByName('Pict').Clear;

  IBQuery1.Transaction.StartTransaction;
  IBQuery1.ExecSQL;
  IBQuery1.Transaction.Commit;
end;
-----------------------
Чтение из BLOB в TImage (jpeg или bmp)
Код:
procedure Form1.LoadImg;
var
  Ss : TStringStream;
  St : string;
  jpg: TJpegImage;
begin
  IBQuery1.SQL.Text := 'select * from catalog where id = '+IntToStr(IDc);
  IBQuery1.Open;
  st := IBQuery1.FieldByName('Pict').AsString;
  Ss := TStringStream.Create(st);
  if Ss.Size > 0 then begin
    if IBQuery1.FieldValues['Typ'] = 1 then begin
      jpg := TJpegImage.Create;
      jpg.LoadFromStream(Ss);
      Imgage1.Picture.Assign(jpg);
      jpg.Free;
    end;
    if IBQuery1.FieldValues[TypN] = 0 then
      Imgage1.Picture.Bitmap.LoadFromStream(Ss)
  end;
  Ss.Free;
  IBQuery1.Close;
  IBQuery1.Transaction.Commit;
end;
Код выдран из работающего проекта. Его адаптация под свои условия представляется делом не сложным.

Последний раз редактировалось Прик; 19.04.2012 в 08:12.
Прик вне форума Ответить с цитированием
Старый 30.04.2012, 23:36   #3
athleet
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 22
По умолчанию

Я все равно не понял.
Вот кнопка добавляет запрос в listbox
Код:
 0:begin   {Добавление}
   sListBox1.Items.Clear;
   Zapros := 'INSERT INTO ' + TBL + ' Values(';
    CASE sRadioGroup1.ItemIndex OF {Таблицы}
     0:begin
       Zapros := Zapros+sEdit7.Text+', '+#39+sEdit8.Text+#39+', '
                 +#39+sEdit9.Text+#39+', '+#39+sEdit10.Text+#39+', '+#39+sEdit11.Text+#39+')';
       end; {0}

     1:begin
       Zapros := Zapros+sEdit7.Text+', '+#39+sEdit8.Text+#39+', '
                 +#39+sEdit9.Text+#39+', '+#39+sEdit10.Text+#39+')';
       end; {1}

     2:begin
       Zapros := Zapros+sEdit7.Text+', '+#39+sEdit8.Text+#39+')';
       end; {2}

     3:begin


        Zapros:=Zapros
      +#39+sEdit7.Text+#39+','
      +#39+sEdit8.Text+#39+','
      +#39+sEdit9.Text+#39+','
      +#39+sEdit10.Text+#39+','
      +':foto' + ','
      +#39+sEdit12.Text+#39+')';




DataModule2.IBQuery5.Params.CreateParam(ftBlob,'pict',ptInput);
DataModule2.IBQuery5.Params.CreateParam(ftBlob,'foto',ptInput);
      Ss := TStringStream.Create(st);
      Image1.Picture.Bitmap.SaveToStream(Ss);
       DataModule2.IBQuery5.ParamByName('pict').AsSmallInt := 0;
        DataModule2.IBQuery5.ParamByName('foto').AsBlob := Ss.DataString;
    Ss.Free;


      // DataModule2.IBQuery5.Params.CreateParam(ftGraphic,'foto',ptInput);
      // DataModule2.IBQuery5.Params.ParamByName('foto').LoadFromFile(sEdit11.Text, ftGraphic);




       end; {3}
    end; {case}
     sListBox1.Items.Add(Zapros);
  end;
Вот кнопка исполняет
Код:
 WITH DataModule2.IBQuery5 do begin
  SQL.Clear; SQL:=sListBox1.Items;
  ExecSQL;

 END; {with}
   
 DataModule2.IBQuery1.Close; DataModule2.IBQuery1.Open;
 DataModule2.IBQuery2.Close; DataModule2.IBQuery2.Open;
 DataModule2.IBQuery3.Close; DataModule2.IBQuery3.Open;
 DataModule2.IBQuery4.Close; DataModule2.IBQuery4.Open;
Либо поле блоб пустое либо ошибка про xsqlda. Чего не так делаю? Вот в этот элемент загрузил фотку сразу Image1.Picture.Bitmap, чтобы отсюда в поток заливало.
athleet вне форума Ответить с цитированием
Старый 01.05.2012, 06:41   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ошибок предостаточно.

'INSERT INTO ' + TBL + ' Values('
Предполагает, что значения, передаваемые затем в скобках после слова Values, будут соответствовать количеству и порядку столбцов в указанной таблице. А в операторе case мы видим, что может быть передано меньшее количество значений чем полей в таблице.

Основная ошибка в том что параметры создаются в ручную. А этого делать нельзя. Список параметров создается автоматически, если в запросе указать нужные (имена параметров с двоеточием впереди - см. пример из поста #2). Логика простая (о чем можно прочитать в справке по параметрам датасетов, если взять на себя труд и эту справку почитать) - созданные "ручным способом" параметры не привязаны к конкретным полям. Совпадение наименований (поля и параметра) ничего не значит и парсингом датасета не рассматривается.

Вызывает некоторое недоумение использование листбокса для формирования текста запроса (вопрос из области: "а на хрена козе баян?"). Ну, это не ошибка, но все же мыканье текста по разным пристанищам не придает уверенности, что он не подведет в нужный момент.

Кстати,
Цитата:
...ошибка про xsqlda
как раз и рассказывает, что с запросом что-то не ладно.

Последний раз редактировалось Прик; 01.05.2012 в 07:03. Причина: Кстати
Прик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BLOB поле artemavd БД в Delphi 17 09.08.2016 02:13
Чтение/запись BLOB sql запросом Dmitry333 БД в Delphi 0 06.04.2011 12:54
добавление ФОТО типа blob angel_ok БД в Delphi 4 19.01.2011 10:34
XML в BLOB поле через IBQuery SiNBizkit БД в Delphi 1 08.12.2010 17:52
загрузка сохранение изображения в blob поле Lokos БД в Delphi 1 24.02.2010 06:50