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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 25.05.2010, 18:55   #1
Sewell
 
Регистрация: 19.05.2009
Сообщений: 6
По умолчанию Interbase. Работа с BLOB-полями

Доброго времени суток! Вопрос по BLOB-полям(СУБД: Interbase)

Сохранить, то я сохранил в BLOB-поле текст из Memo:

Код:
 var
  S: TStream;
  D: TStringStream;
begin
     .
     .
     .
   fm_Main.IBDataSet1.Edit;
    S := fm_Main.IBDataSet1.CreateBlobStream(fm_Main.IBDataSet1.FieldByName('opisanie_osmotr'),bmWrite);
     try
      D := TStringStream.Create(AdvMemo1.Lines.Text);
      S.CopyFrom(D,D.Size);
     finally
      D.Free;
      S.Free;
      fm_Main.IBDataSet1.Post;
     end;

А как теперь сделать наоборот, чтобы из BLOB-поля текст отобразился в Memo, например при редактировании записи...

Пробовал сделать вот так, но не работает:
Код:
 var
  S: TStream;
  D: TStringStream;
  k: String;
begin
    fm_Main.IBDataSet1.Edit;
    S := fm_Main.IBDataSet1.CreateBlobStream(fm_Main.IBDataSet1.FieldByName('opisanie_osmotr'),bmRead);
     try
      D := TStringStream.Create(k);
      D.CopyFrom(S,S.Size);
      AdvMemo1.Lines.LoadFromStream(D);
     finally
      D.Free;
      S.Free;
     end;

Помогите, пожалуйста!

Последний раз редактировалось Stilet; 24.11.2010 в 09:00.
Sewell вне форума
Старый 24.11.2010, 07:26   #2
Liones
Пользователь
 
Аватар для Liones
 
Регистрация: 26.11.2008
Сообщений: 81
По умолчанию

А можно мне получить кое-какие разъяснения? Я тоже пытаюсь записать данные из Memo в blob-поле. Мне не понятен вот этот кусок:
Цитата:
Сообщение от Sewell Посмотреть сообщение
Код:
 
   fm_Main.IBDataSet1.Edit;
    S := fm_Main.IBDataSet1.CreateBlobStream(fm_Main.IBDataSet1.FieldByName('opisanie_osmotr'),bmWrite);
     try
      D := TStringStream.Create(AdvMemo1.Lines.Text);
      S.CopyFrom(D,D.Size);
     ....
т.е. открывается таблица для редактирования, создается поток и в него записывается текст из мемо,
потом этот поток копируется в поле. А как быть с остальными полями?
У меня вот такой код:
Код:
DM.IBQTemp.SQL.Add('insert into KARTOTEK (NAME_B,NETTO,BEL_U,GIR_U,UGL_U,BEL_S,GIR_S,UGL_S,KC_U,KC_S,TEHN,TREB,PRIM)');
    DM.IBQTemp.SQL.Add('values ('+#39+Blank.Edit1.Text+#39+','+#39+Blank.Label19.Caption+#39+
','+#39+Blank.Label15.Caption+#39+',');
    DM.IBQTemp.SQL.Add(#39+Blank.Label16.Caption+#39+','+#39+Blank.Label17.Caption+#39+
','+#39+Blank.Label1.Caption+#39+','+#39+Blank.Label12.Caption+#39+',');
    DM.IBQTemp.SQL.Add(#39+Blank.Label13.Caption+#39+','+#39+Blank.Label18.Caption+#39+
','+#39+Blank.Label14.Caption+#39+','+#39+Blank.Memo1.Text+#39+',');
    DM.IBQTemp.SQL.Add(#39+Blank.Memo2.Text+#39+','+#39+Blank.Edit2.Text+#39+');');
Не могу понять как мне записать поля TEHN и TREB. Помогите, пожалуйста.

Последний раз редактировалось Stilet; 24.11.2010 в 09:00.
Liones вне форума
Старый 24.11.2010, 11:04   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Совсем незачем мудрить с BLOB. Тем более, если пишется из и читается в TMemo.
Применяйте обычный способ записи в BLOB (и чтения) точно так же как и в поле других типов - сервер разберется.
Как Liones показал. Только чего ему этот запрос не нравится, не понятно.

А Stream нужен (если вообще нужен) для записи и чтения бинарных данных. Да и здесь можно использовать переменные типа string.

---
Если не получается, есть способ через параметр
Код:
qr.ParamByName('SOMEFIELD').AsBlob := <строка>; //запись
S := qr.FieldByName('SOMEFIELD').AsString;  //чтение
BLOB должен быть с подтипом 1
BLOB подтипа 1 должен давать записывать как обычное поле (в запросах insert, update). Читаться как AsVariant.

Последний раз редактировалось Прик; 25.11.2010 в 07:49. Причина: другой способ
Прик вне форума
Старый 25.11.2010, 06:55   #4
Liones
Пользователь
 
Аватар для Liones
 
Регистрация: 26.11.2008
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Как Liones показал.
Ну так то я женкого полу
Цитата:
Сообщение от Прик Посмотреть сообщение
Только чего ему этот запрос не нравится, не понятно.
Мне то запрос нравится, компилятор ругается на несоотвествие типов. Говорит "не могу записать строку в blob"
Liones вне форума
Старый 25.11.2010, 07:40   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Запросы типа:
Код:
qr.SQL.Text := 'INSERT INTO VAL_S (ID, IDFIELD, IDCARD, VALB) values ('+
                IntToStr(aId) +','+ IntToStr(aIdField)+ ','+ IntToStr(aIdCard)+ ','+
                QuotedStr(ValStr)+')';
компилируются и пишутся без ошибок (поле VALB - типа BLOB; ValStr - string, такой же тип как и Memo.Lines.Text).

Характеристика BLOB домена:
BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET WIN1251

Delphi 7 - IBX - СУБД Firebird.

Чего в вашем запросе компилятору не по нраву?. Вроде составлен по науке. Во всяком случае, на первый взгляд криминала не видно.
---
Хотя в последний момент увидел.
Blank.Memo1.Text - это не текст, который мы видим в окне компонента.
Надо так: Blank.Memo1.Lines.Text.
Т.е. дело вовсе не в BLOB и не в запросе.

Последний раз редактировалось Прик; 25.11.2010 в 07:42. Причина: Криминал есть.
Прик вне форума
Старый 25.11.2010, 08:46   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Учитывая что тема - мертвец. Закрываю.
I'm learning to live...
Stilet вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BLOB и Interbase RuVarez Общие вопросы Delphi 1 27.08.2010 21:51
параметрическое открытие OpenForm, работа с полями таблицы через .Fields Познающий Microsoft Office Access 10 16.06.2010 01:50
Программная работа с полями (формула) NomadV Microsoft Office Word 7 08.04.2010 15:21
Работа с Interbase artemavd Общие вопросы Delphi 1 25.09.2009 23:30
Работа с BLOB artemavd БД в Delphi 6 24.07.2009 18:17