Конференция "Базы" » Ошибка при сохранении в blob [D7]
 
  • Geo (03.06.11 16:01) [0]
    Добрый день друзья. Не могу никак понять, в чем ошибка

    вот код

    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

    Пробовал по-разному эту процедуру реализовать, все никак
  • Geo (03.06.11 16:17) [1]
    решил проблему сам, все оказалось проще, чем я думал
    with Login_form.ADOQuery1 do
     begin
     edit;
     FieldByName('MORE').Value:=RichEdit1.Lines.Text;
     post;
     end


    и все) а почему та ошибка появлялась, все равно интересно, при разработке пользовался вот этой статьей http://www.kansoftware.ru/?tid=3789

    где исходный код (без моих изменений):
    procedure TForm1.BtnPutClick(Sender: TObject);
    var
     bs: TBlobStream;
    begin
     bs := nil;
     with Table1 do
       try
         open;
         first;
         edit;
         bs := TBlobStream.Create(table1memo, bmwrite);
         Richedit1.plaintext := false;
         Richedit1.Lines.Savetostream(bs);
         post;
       finally
         bs.free;
         close;
       end;
    end;

  • Geo (03.06.11 16:42) [2]
    Хм... нет, так не пойдет, нужно сохранить с форматированием, не подскажите как?
  • Geo (03.06.11 17:45) [3]
    Также если делать

    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
  • clickmaker © (03.06.11 17:54) [4]
    а смысл 2-й раз AdoTable1.Edit вызывать?
  • Geo (03.06.11 18:03) [5]
    Это я думал, может быть одна из функций меняет режим доступа. Но в любом случае возникает эта ошибка.
  • clickmaker © (03.06.11 18:06) [6]
    > одна из функций меняет режим доступа

    так бессмысленно менять режим доступа уже после этого самого доступа
  • clickmaker © (03.06.11 18:10) [7]
    Запись именно редактируется, а не Insert?
  • Geo (03.06.11 18:27) [8]
    да, редактируется, но на всякий случай пробовал и режим AdoTable1.Insert. безразультатно.
  • Geo (03.06.11 19:31) [9]
    Никто не подскажет, почему

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



    дает пустой Richedit1?
  • sniknik © (03.06.11 20:09) [10]
    позиция в конце?
  • Geo (03.06.11 20:22) [11]
    ага, уже понял в чем была эта ошибка... спасибо
  • Geo (03.06.11 20:41) [12]
    Но глобальная проблема также осталась..
  • Geo (03.06.11 21:17) [13]
    Потратил целый день, но нашел решение
    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;



    Перерыл кучу неработающих исходников
  • Geo (03.06.11 21:21) [14]
    Спасибо всем, кто пытался помочь, надеюсь этот пост поможет еще кому-то)
    В начале очищаем переменные-а потом уже post
  • sniknik © (03.06.11 22:29) [15]
    > надеюсь этот пост поможет еще кому-то)
    надеюсь что нет...

    насколько же все проще с датасетом... не нужно днями рыть ради элементарного... просто в хелп заглянуть и все, и где хочешь(/логичнее) там и post

    var
     ms: TMemoryStream;
    begin
     ms:= TMemoryStream.Create;
     try
       Image1.Picture.Bitmap.SaveToStream(ms);
       ADODataSet1.Edit;
       TBlobField(ADODataSet1.FieldByName('ImField')).LoadFromStream(ms);
       ADODataSet1.Post;
     finally
       ms.Free;
     end;
    end;

  • Johnmen © (03.06.11 23:24) [16]
 
Конференция "Базы" » Ошибка при сохранении в blob [D7]
Есть новые Нет новых   [134431   +13][b:0][p:0.002]