Работа с blob

geonew
Дата: 03.06.2011 18:06:49
Добрый день друзья. Не могу никак понять, в чем ошибка

вот код

procedure TDiary_form.BitBtn1Click(Sender: TObject);
var
 bs: TStream;
 table1memo: TBlobField;
begin
 CreateUn('SELECT * FROM DIARY_SURVEY');
 bs := nil;
 with Login_form.ADOQuery1 do
   try
     open;
     //first;
     edit;     //stream:= ibquery1.CreateBlobStream(ibquery1.FieldByName('messagebody') as TBlobField, bmRead);
     bs := Login_form.ADOQuery1.CreateBlobStream(Login_form.ADOQuery1.FieldByName('MORE') as TBlobField, bmwrite);
     Richedit1.plaintext := false;
     Richedit1.Lines.Savetostream(bs);
     edit;
     post;
   finally
     bs.free;
     close;
   end;
end;


Ошибка на post;

DataSet not edit or inset mode


Пробовал по-разному эту процедуру реализовать, например:

begin

ms:= TMemoryStream.Create;
Richedit1.Lines.SaveToStream(ms);

AdoTable1.Edit;
bs:= AdoTable1.CreateBlobStream(AdoTable1.FieldByName('MORE') as TBlobField, bmwrite);
Richedit1.Lines.Savetostream(ms);
TBlobField(AdoTable1.FieldByName('MORE')).LoadFromStream(ms);
AdoTable1.Edit;
AdoTable1.Post;
bs.Free;
ms.Free;

та же ошибка AdoTable1: DataSet not edit or insert mode


При чем вот так
with Login_form.ADOQuery1 do
 begin
 edit;
 FieldByName('MORE').Value:=RichEdit1.Lines.Text;
 post;
 end

все работает, но это мне не подходит, т.к. нужно сохранить форматирование.
Gwa
Дата: 03.06.2011 18:14:01
geonew,
зачем Вы два раза делаете edit ?
может это создаёт проблему?
и что это за CreateUn ?
geonew
Дата: 03.06.2011 18:31:01
Это я думал, может быть одна из функций меняет режим доступа. Но в любом случае возникает эта ошибка.

CreateUn-это моя процедура. Выполняет введенный SQL-запрос в Login_form.ADOConnection1
geonew
Дата: 03.06.2011 19:39:41
Никто не подскажет, почему

ms:= TMemoryStream.Create;
Richedit1.Lines.SaveToStream(ms);
Richedit1.Lines.LoadFromStream(ms);

дает пустой Richedit1?
andreymx
Дата: 03.06.2011 20:24:00
geonew
Никто не подскажет, почему

ms:= TMemoryStream.Create;
Richedit1.Lines.SaveToStream(ms);
Richedit1.Lines.LoadFromStream(ms);

дает пустой Richedit1?
а перед операцией Richedit1 непустой?
andreymx
Дата: 03.06.2011 20:42:03
хелп:
procedure TForm1.Button1Click(Sender: TObject);

var
  TempStream : TMemoryStream;
begin
  TempStream := TMemoryStream.Create;

  ListBox1.Items.SaveToStream(TempStream);  // write list box contents to the 
                                            // stream
  TempStream.Position := 0;      // reset to the beginning of the stream
  RichEdit1.Lines.LoadFromStream( TempStream); // load stream contents into rich 
                                               // edit control

  TempStream.Free;
end;
geonew
Дата: 03.06.2011 20:43:22
andreymx,

это я уже решил,
ms.Position := 0;

но глобальная проблема осталась
geonew
Дата: 03.06.2011 20:44:30
andreymx
хелп:
procedure TForm1.Button1Click(Sender: TObject);

var
  TempStream : TMemoryStream;
begin
  TempStream := TMemoryStream.Create;

  ListBox1.Items.SaveToStream(TempStream);  // write list box contents to the 
                                            // stream
  TempStream.Position := 0;      // reset to the beginning of the stream
  RichEdit1.Lines.LoadFromStream( TempStream); // load stream contents into rich 
                                               // edit control

  TempStream.Free;
end;



все равно спасибо)
andreymx
Дата: 03.06.2011 20:52:31
не знаю АДО, но в Оракле и в ДОА с БЛОБами не все так просто (мне показалось)
по-моему, там вообщ пост не нужен был
geonew
Дата: 03.06.2011 21:19:23
Потратил целый день, но нашел решение
procedure TDiary_form.Button2Click(Sender: TObject);

var
 blob: TStream;
 ms: TMemoryStream;
 begin
  AdoTable1.Edit;
 blob := AdoTable1.CreateBlobStream(AdoTable1.FieldByName('MORE'), bmWrite);
 try
   blob.Seek(0, soFromBeginning);
     ms:= TMemoryStream.Create;
     Richedit1.Lines.Savetostream(ms);
     ms.Position := 0;
   try
     blob.CopyFrom(ms, ms.Size);

   finally
     ms.Free
   end;
 finally
   blob.Free
 end;
  AdoTable1.Post;
end;

Перерыл кучу неработающих исходников. Спасибо всем, кто пытался помочь, надеюсь этот пост поможет еще кому-то)
В начале очищаем переменные-а потом уже post