数据库查询问题……怎么实现把RichEdit的数据存入数据库并取出到另一个RichEdit嗄?(30分)

  • 主题发起人 主题发起人 etu5
  • 开始时间 开始时间
E

etu5

Unregistered / Unconfirmed
GUEST, unregistred user!
现了个"RichEdit insertion error"错误提示
看看偶的实现吧:
这个是存到数据库的代码:
//--------------------------------------

str1:=main.MainForm.CBB_subject.Text+'_'+main.MainForm.getFullName(main.MainForm.TreeView1.Selected);
str2:=RichEdit_content.text; //读取RichEdit_content.text到str2
str3:=Edit_description.text;
str4:=Edit_memo.Text;
str5:=edit_caption.Text;
str6:=datetostr(date)+' '+timetostr(time);
with main.MainForm Do
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('insert into note(title,content,description,memo,caption,LastTimeModified)');
Query1.SQL.Add('values(:tt,:cnt,:dspt,:mm,:cpt,:ltm)');
Query1.Unprepare;
Query1.ParamByName('tt').AsString:=str1;
Query1.ParamByName('cnt').Asstring:=str2; //str2付给数据库中content列
Query1.ParamByName('dspt').AsString:=str3;
Query1.ParamByName('mm').AsString:=str4;
Query1.ParamByName('cpt').AsString:=str5;
Query1.ParamByName('ltm').AsString:=str6;
Query1.prepare;
Query1.ExecSQL;
end;
//---------------------------------------------------

下面是从数据库取出的代码:

settingstr:=' '; //首行空两格
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from "note.db"');
Query1.SQL.Add('where title="'+CBB_subject.Text+'_'+GetFullName(TreeView1.Selected)+'"');
Query1.Open;
RichEdit_show.Clear;
RichEdit_show.Lines.Add(settingstr+Query1.fieldbyname('caption').AsString);
RichEdit_show.Lines.Add(settingstr+'');
RichEdit_show.Lines.Add(settingstr+'--------------------------------------------');
RichEdit_show.Lines.Add(settingstr+'简要描述:');
RichEdit_show.Lines.Add(settingstr+' '+Query1.fieldbyname('description').AsString);
RichEdit_show.Lines.Add(settingstr+'--------------------------------------------');
RichEdit_show.Lines.Add(settingstr+'');
RichEdit_show.Lines.Add(settingstr+Query1.fieldbyname('content').AsString); //就是这句出问题了,content就是那个MEmo型的数据
RichEdit_show.Lines.Add(settingstr+'');
RichEdit_show.Lines.Add(settingstr+'--------------------------------------------');
RichEdit_show.Lines.Add(settingstr+'备注: ');
RichEdit_show.Lines.Add(settingstr+' '+Query1.fieldbyname('memo').AsString);
RichEdit_show.Lines.Add(settingstr+'--------------------------------------------');
RichEdit_show.Lines.Add(settingstr+'最后一次编辑时间: '+Query1.fieldbyname('LastTimeModified').AsString);


各位看看嗄 如果content里面的字符串少于255个就没有提示错误,可以在RIchEdit里面显示出来……可是只要大于255个就出现那个提示

偶该怎么进行转换?
 
急嗄~~~~~~~~~~各位富翁不要袖手旁观嗄,帮帮偶这个穷人嘛~~~~~~~~~

拜托!!
 
当然有问题,变量有范围的,你用blob类型的变量就可以了,用stream技术就可以了
 
可以给出具体代码让偶学学嘛?

谢谢!!无限感激!!
 
要保存RichEdit中的内容到数据库,最好适应BLOB字段,一般VARCHAR会丢失文本样式,而且
长度有限制。
你可以先把RichEdit的内容保存到一个临时的文件,也可以使用Stream实现。下面是相关
的过程。
procedure SaveRichEditBlobField(FieldName: string; DataSet: TDataSet;
RichEdit: TRichEdit);
var
MemoStream: TMemoryStream;
Blob: TStream;
begin
if RichEdit.Lines.Count = 0 then
begin
Exit;
end;
Screen.Cursor := crHourGlass;
MemoStream := TMemoryStream.Create;
try
RichEdit.Lines.SaveToStream(MemoStream);
MemoStream.Seek(0,soFromBeginning);
Blob := DataSet.CreateBlobStream(DataSet.FieldByName(FieldName),bmWrite);
try
Blob.Seek(0,soFromBeginning);
Blob.CopyFrom(MemoStream,MemoStream.Size);
finally
Blob.Free;
end;
finally
MemoStream.Free;
Screen.Cursor := crDefault;
end;
end;

procedure LoadRichEditFromBlobField(FieldName: string; DataSet: TDataSet;
RichEdit: TRichEdit);
var
Blob: TStream;
begin
if DataSet.FieldByName(FieldName).IsNull then
begin
Exit;
end;
Screen.Cursor := crHourGlass;
Blob := TMemoryStream.Create;
try
TBlobField(DataSet.FieldByName(FieldName)).SaveToStream(Blob);
Blob.Seek(0, soFromBeginning);
if Blob.Size = 0 then
begin
Exit;
end;
RichEdit.LoadFromStream(Blob);
finally
Blob.Free;
Screen.Cursor := crDefault;
end;
end;
 
TBlobField是什么类嗄? 谢谢楼上的代码 试验中。。。
 
能解释一下下面这句吗?
Blob := DataSet.CreateBlobStream(DataSet.FieldByName(FieldName),bmWrite);

Blob.Seek(0,soFromBeginning);
Blob.CopyFrom(MemoStream,MemoStream.Size);

---------------
TBlobField是什么类嗄?
 
偶需要的是用SQL语句的插入和检索嗄……楼上的方法好像要设置TQuery的RequestLive属性
为True才行
还有这个Blob := DataSet.CreateBlobStream(DataSet.FieldByName(FieldName),bmWrite);
DataSet.FieldByName(FieldName)是个TField类型嗄,偶要得是把Query1.ParamByName('cnt')
得到赋值嗄,就是把RIchEdit的值插入到数据库表note.db的content列里面去嗄
 
各位DFW们快出现嗄!!

很急嗄!

拜托!
 
Blob := TMemoryStream.Create;
TBlobField(Query1.FieldByName('Content')).SaveToStream(Blob);
Blob.Seek(0, soFromBeginning);
tmpstr:=TStringList.Create;
tmpstr.LoadFromStream(Blob);
RichEdit_show.Lines.Add(tmpstr.Text+'');
这里提示"RichEdit insertion error"怎么回事嗄?
注:Content列存储的是MEMO型的字符串
文件能显示的(那个tmpstr.text),就是显示以后就出现那个错误提示的。而且直接用
RIchEdit.lines.loadfromStream(Blob)的话就能成功,不会出错……
 
TBlobField是二进制数据字段,象Oracle BLOB字段
 
etu5:
你使用的数据库类型和连接数据库方式?
 
谢谢各位的答复,偶的问题已经解决了。
原因是:
RichEdit.Lines.SaveToStream(MemoStream);不仅把RichEdit.text的数据存入MemoStream了,还将RIchEdit控件的一些属性信息也存入了MemoStream,比如:
RichEdit.text:='RichEdit1';
则经过RichEdit.Lines.SaveToStream(MemoStream);后,MemoStream实际的数据为:
{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052{/fonttbl{/f0/fnil/fcharset134 MS Sans Serif;}}
/viewkind4/uc1/pard/lang2052/f0/fs16 RichEdit1
/par }
上面这些信息是关于RichEdit的信息,不会在RichEdit.text显示出来,
然后偶在读取记录的时候用下面的语句:
TBlobField(Query1.FieldByName('Content')).SaveToStream(Blob);
Blob.Seek(0, soFromBeginning);
tmpstr:=TStringList.Create;
tmpstr.LoadFromStream(Blob);
RichEdit_show.Lines.Add(tmpstr.Text+'');
这个时候tmpstr里面包含的是RichEdit的数据和RichEdit的信息,就是上面提到的
{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052{/fonttbl{/f0/fnil/fcharset134 MS Sans Serif;}}
/viewkind4/uc1/pard/lang2052/f0/fs16 RichEdit1
/par }
这些是RichEdit控件的信息,不能通过RichEdit_show.Lines.Add(tmpstr.Text+'');这样得到(但是可以显示出字符串数据,显示后就会提示出错)。
而直接RichEdit_show.Lines.loadFormStream(Blob)这就没问题

偶的解决方案是:
RichEdit_show.lines.loadFormStream(Blob); //这样那些RichEdit控件信息已经加到RichEdit_show里面去了
tmpstr.add(RichEdit_show.text); //RichEdit_show.text没有上述的那些信息
RichEdit_show.lines.add('您存入数据库的数据加载如下:');
RichEdit_show.lines.add('------------------');
RichEdit_show.lines.add(tmpstr.text);
RichEdit_show.lines.add('------------------');
//这样做的好处是自己可以随意在RichEdit里加上自己想要加上的信息,而不仅仅是存入数据库的那些字符串数据
更加灵活了……
 
那个格式不是Richedit的属性,是RTF文件的格式。
 
谢谢楼上的纠正:)
 
多人接受答案了。
 
后退
顶部