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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2012, 21:48   #1
unypol
Новичок
Джуниор
 
Регистрация: 13.09.2012
Сообщений: 5
По умолчанию Как в BLOB поле Вставить текст из TMemo

Очень большая проблема...поможете в долгу не останусь
Необходимо провести сохранение в базу Blob поле базы данных текста Мемо.
Использую InterBase.
Код:
procedure TСТРОЙПРОЕКТ.Button8Click(Sender: TObject);
var
  sl : TStringList;
begin



 //Fnew:=true;
////сохранить
try
with IBQuery2 do
begin
  if Fnew then
  begin
  SQL.Text := 'execute procedure PROC_spisok('+ id.Text +', ''' + eOo.Text + ''',  ''' + etvnperek.Text + ''')';
    Transaction.StartTransaction;
  ExecSQL;

  Transaction.Commit;
             
  Transaction.Active:=false;

  SQL.Text := 'execute procedure spisok1('+ id.text +','+ teplo1.Text +')';
   ExecSQL;

  Transaction.Commit;
Подскажите как всётаки организовать запись и последующий вывод данных из БЛОБ поля.

Последний раз редактировалось Stilet; 13.09.2012 в 22:37.
unypol вне форума Ответить с цитированием
Старый 14.09.2012, 07:04   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

1. Использовать параметры в запросе.
2. Строка
Код:
Transaction.Active:=false;
- лишняя.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.09.2012, 09:51   #3
unypol
Новичок
Джуниор
 
Регистрация: 13.09.2012
Сообщений: 5
По умолчанию

У меня ничего не выходит, можно поподробнее как сделать запись в блоб поле из ТМемо?

попробовал вот так сделать выдаёт ошибку: IBQuery2: Cannot perform this on closed dataset

Код:
St := TMemoryStream.Create;
 teplo1.Lines.SaveToStream(St);
 St.Position:=0;
 IBQuery2.Insert;
 TBlobField(IBQuery2.FieldByName('bb')).LoadFromStream(st);
    if IBQuery2.Modified then
     IBQuery2.Post;
     St.Free;
Помогите с кодом...очень прошу...

Пробую вот так:
Код:
 sql.Add('update spisok set bb  where id = ' + id.Text);
   Open;
   if RecordCount > 0 then
  begin
    Edit;
    TBlobField(IBQuery1.FieldByName('bb')).AsString := teplo1.Lines.Text;
    if Modified then
      Post
  end;
  Transaction.StartTransaction;
    ExecSQL;
  Transaction.Commit;
  Transaction.Active:=false;
Ошибок не возникает, но при считываниие обратно в memo поле:
teplo1.Lines.Text := IBQuery1.FieldByName('bb').AsString ;

поле оказывается пустым...
Помогите кто нибудь

Вот так пробую , тоже пусто

Код:
 sql.Clear;
   sql.Add('update spisok set bb  where id = ' + id.Text);
   IBQuery1.Open;
   stream := TStringList.Create;

  begin
    IBQuery1.Edit;
IBQuery1.FieldByName('bb').AsVariant := teplo1.lines.Text;
      IBQuery1.Post;
  end;
  Transaction.StartTransaction;
    ExecSQL;
  Transaction.Commit;
  Transaction.Active:=false;
Есть тут знатоки, как мне всётаки сделать запись из мемо в блоб ???

Последний раз редактировалось artemavd; 16.09.2012 в 09:20.
unypol вне форума Ответить с цитированием
Старый 14.09.2012, 14:14   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
IBQuery1.Close;
IBQuery1.SQL.Text:='UPDATE tablitsa SET field = :p_field WHERE id = :id';
TBlobField(IBQuery1.ParamByName('field')).Value:=Memo1.Text;
IBQuery1.ExecSQL;
SQL_TR.Commit; // SQL_TR - транзакция
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 14.09.2012, 14:34   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
TBlobField(IBQuery1.ParamByName('fi eld')).Value
TParam приводится к TBlobField? Что-то новое. Там или метод LoadFromStream, или SetBlobData. Возможно и Assign подойдет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.09.2012, 15:27   #6
unypol
Новичок
Джуниор
 
Регистрация: 13.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
Код:
IBQuery1.Close;
IBQuery1.SQL.Text:='UPDATE tablitsa SET field = :p_field WHERE id = :id';
TBlobField(IBQuery1.ParamByName('field')).Value:=Memo1.Text;
IBQuery1.ExecSQL;
SQL_TR.Commit; // SQL_TR - транзакция
Получаем ошибку:
[DCC Error] Unit3.pas(1114): E2010 Incompatible types: 'TBytes' and 'TCaption'

Есть ещё какие нибудь варианты????

St := TMemoryStream.Create;

teplo1.Lines.SaveToStream(St);
St.Position:=0;
edit;
SQL.Text := 'insert into spisok (bb) values (:fn_BB)';
TBlobField(IBQuery1.FieldByName('bb ')).LoadFromStream(St);
Transaction.StartTransaction;
ExecSQL;

Transaction.Commit;
Transaction.Active:=false;

Вроде бы правильно, но тут возникает ошибка: Cannot perform this operation on a closed dataset/// Подскажите как исправить

Люди помогите!!!!

Сделал вот так
SQL.Text := 'execute procedure mblob('+ id.Text +', '''+ teplo1.lines.Text +''')';
но после загрузки BLOB обратно в мемо получаем кракозыбры:
⃨⃿ﯬ⃻⃮ ⻬턠ഠ│⃠ﳲ⃾ Ⳡ⃨ﻠ⃨⃩⃨ ⻻਍

Как поправить не подскажете???

Последний раз редактировалось artemavd; 16.09.2012 в 09:21.
unypol вне форума Ответить с цитированием
Старый 14.09.2012, 17:54   #7
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

у меня на firebird 2.5 отлично работает
Код:
procedure TForm1.btnSaveToBlobClick(Sender: TObject);
begin
IQ.Close;
IQ.SQL.Text:='UPDATE TBL SET b_pole = :p_blob WHERE id = :p_id';
IQ.ParamByName('p_id').AsInteger:=1;
IQ.ParamByName('p_blob').AsBlob:=Memo1.Text;
IQ.ExecSQL;
IQ_TR.Commit;
end;

procedure TForm1.btnGetBlobDataClick(Sender: TObject);
begin
IQ.Close;
IQ.SQL.Text:='SELECT * FROM TBL';
IQ.Open;
Memo1.Text:=IQ.FieldByName('b_pole').AsString;
end;
ЗЫ. в самой БД блоб поле имеет тип "text", длину 5000 и кодировку WIN1251 (в базе и в приложении)
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 14.09.2012 в 17:56.
Yurk@ вне форума Ответить с цитированием
Старый 14.09.2012, 19:38   #8
unypol
Новичок
Джуниор
 
Регистрация: 13.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
у меня на firebird 2.5 отлично работает
Код:
procedure TForm1.btnSaveToBlobClick(Sender: TObject);
begin
IQ.Close;
IQ.SQL.Text:='UPDATE TBL SET b_pole = :p_blob WHERE id = :p_id';
IQ.ParamByName('p_id').AsInteger:=1;
IQ.ParamByName('p_blob').AsBlob:=Memo1.Text;
IQ.ExecSQL;
IQ_TR.Commit;
end;

procedure TForm1.btnGetBlobDataClick(Sender: TObject);
begin
IQ.Close;
IQ.SQL.Text:='SELECT * FROM TBL';
IQ.Open;
Memo1.Text:=IQ.FieldByName('b_pole').AsString;
end;
ЗЫ. в самой БД блоб поле имеет тип "text", длину 5000 и кодировку WIN1251 (в базе и в приложении)
Решил задачу следующим образом:
создал процедуру в IB expert:
Код:
begin
update
spisok
set
BB=:fn_BB,
MHAR=:fn_mhar,
opisanie=:Fn_opisanie,
melek=:FN_MELEK,
elektroprov=:fn_elek,
vivod462=:fn_vivod462,
TEPLO=:fn_teplo
WHERE
ID=:fn_id;


end
Сделал SQL запрос из Delphi :
Код:
SQL.Text := 'execute procedure mblob('+ id.Text +', '''+ teplo1.lines.Text +''', '''+ eopisanie.lines.Text +''', '''+ mhar.lines.Text +''', '''+ melek.lines.Text + ''', '''+ elektroprovodka.lines.Text + ''', '''+ VIVOD462.lines.Text + ''', '''+ teplo.lines.Text + ''')';
Вывод данных их блоб поля осуществил вот так:
Код:
teplo1.Lines.Text := IBQuery1.FieldByName('bb').AsString;
eOpisanie.Lines.Text := IBQuery1.FieldByName('opisanie').AsString;
mhar.Lines.Text := IBQuery1.FieldByName('mhar').AsString;
mElek.Lines.Text := IBQuery1.FieldByName('melek').AsString;
elektroprovodka.Lines.Text := IBQuery1.FieldByName('elektroprov').AsString;
VIVOD462.Lines.Text := IBQuery1.FieldByName('VIVOD462').AsString;
teplo.Lines.Text := IBQuery1.FieldByName('teplo').AsString;
Всем спасибо!!!!

Ещё вопрос. Не подкажете сколько полей максимум может иметь база данных???

Последний раз редактировалось artemavd; 16.09.2012 в 09:22.
unypol вне форума Ответить с цитированием
Старый 14.09.2012, 20:14   #9
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

если не изменяет память - до 1000
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 14.09.2012, 20:18   #10
unypol
Новичок
Джуниор
 
Регистрация: 13.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
если не изменяет память - до 1000
Спасибо!!! То что надо!!! А то у меня примерно 200 - 250 полей...

Ты заколебал чат тут разводить!!! Еще раз увижу в твоем исполнении 3 страницы чата без оформленного тегами кода - забаню пожизненно!!!

Последний раз редактировалось artemavd; 16.09.2012 в 09:24.
unypol вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить компонент в поток и сразу же его загрузить в BLOB поле? artemavd Общие вопросы Delphi 17 17.05.2012 23:52
Как занести картинку в BLOB-поле? simka16 Общие вопросы Delphi 0 16.01.2011 14:49
Как узнать какой текст выделен в текст поле mogul82 JavaScript, Ajax 2 02.11.2008 16:32
Может кто знает как вставить текст в чужое поле ввода Dark_Elf Win Api 4 20.08.2008 13:47
Как очистить Blob поле Anticoors Общие вопросы Delphi 0 08.01.2007 01:38