Код для примера, без обработки ошибок. Предполагается, что подключение у нас уже создано в отдельном модуле и на форме добавлен компонент FDQuery. Также в базе создано BLOB поле.
Запись в базу через поток MemoryStream
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
procedure TMainForm.bTestClick(Sender: TObject); var ms:tmemortStream; wmp: TWindowsMediaPlayer; begin ms:=tmemorystream.Create; ms.position:=0; FDQuery.Connection:=DBConnection.FDConnection; //Создаем и вставляем контрол wmp:=TWindowsMediaPlayer.Create(Self); RichViewEdit1.InsertControl('',wmp,rvvaBaseline); //Готовим поток ms.Clear; ms.Position:=0; //Записываем в него RichViewEdit1.SaveRVFToStream(ms,false); ms.Position:=0; //Чистим базу FDQuery.SQL.Text:='delete from test_db.htmltable where id>1;'; FDQuery.ExecSQL; FDQuery.SQL.Text:='SELECT * FROM test_db.htmltable;'; FDQuery.Open(); // Вставка в базу FDQuery.Insert; TBlobfield(FDQuery.FieldByName('Blobfield')).LoadFromStream(MS); FDQuery.Post; Freeandnil(ms); end; |
Чтение из базы через поток MemoryStream
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
procedure TMainForm.BitBtn20Click(Sender: TObject); var ms1:TMemoryStream; begin RegisterClass(TWindowsMediaPlayer); RichViewEdit1.ReformatAll; RichViewEdit1.ClearAll; ms1:=TMemoryStream.Create; ms1.Position:=0; FDQuery.SQL.Text:='SELECT * FROM test_db.htmltable;'; FDQuery.Open(); TBlobfield(FDQuery.FieldByName('Blobfield')).SaveToStream(ms1); ms1.Position:=0; RichViewEdit1.LoadFromStream(ms1,rvynaNo); RichViewEdit1.ReformatAll; FreeAndNil(ms1); end; |
Какие тонкие места могут быть?
-Опущу здесь обработку ошибок.
-Во-первых memory stream, если данных будет слишком много, memorystream может не справиться, возможно лучше будет использовать filestream.
-Во-вторых BLOB поле. Чтобы сервер БД не падал, лучше заранее побеспокоиться о максимально возможном значении BLOB поля