有关blob存贮及显示(100分)

  • 主题发起人 主题发起人 diwill
  • 开始时间 开始时间
D

diwill

Unregistered / Unconfirmed
GUEST, unregistred user!
我将richedit.text的内容(带表格)用以下代码存入数据库(ora,Sql,blob)和从数据库提取在Dbrichedit里显示。但不成功,望各位高手指教。
procedure TForm1.Button1Click(Sender: TObject);
var
blob:TBlobstream;
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
RichEdit1.Lines.SaveToStream(MS);
with SmartQuery1 do
begin
close;
Sql.Clear;
Sql.Add('insert into mess(tile,writeD,content) values(:EDT1,:DTP1,:memo2)');
prepare;
parambyname('EDt1').asstring:=Edit1.text;
parambyname('dtp1').asdate:=DateTimePicker1.date;
ParamByName('memo2').DataType:=ftOraBlob;
ParamByName('memo2').ParamType:=ptInput;
ParamByName('memo2').LoadFromstream(ms,ftoraBlob);
ExecSql;
end;
finally
MS.Free;
end;
end;//存贮数据
procedure TForm1.Button3Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
MStream: TBlobStream;
begin
with SmartQuery1 do
begin
close;
Sql.Clear;
Sql.Add('select * from mess');
open;
MStream := TBlobStream.Create(SmartQuery1.FieldByName('contents') as TBlobField, bmRead);
try
MemSize := MStream.Size;
Inc(MemSize);
Buffer := AllocMem(MemSize);
try
MStream.Read(Buffer^, MemSize);
DBRichEdit1.SetSelTextBuf(Buffer);
finally
FreeMem(Buffer, MemSize);
end;
finally
MStream.Free;
end;
end;
end;//显示内容

 
从正写的程序中剪些给你。
//打开数据库到richedit
begin
var
VersionNum:Integer;
SerialNum:integer;
fstr:string;
fstr:='select * from issue where (%s%s%s) order by %s';
with ADOQuery2 do
Begin
close;
SQL.Clear;
SQL.Add(Format(fstr,['issue.title','=',('"'+ADOQuery1.fields[1].AsString+'"'),'title']));
Prepared;
open;
End;
while not adoquery2.eof do
begin
VersionNum:=1;
TipNode:=TreeView1.Items.AddChildObject(CatNode,ADOQuery2.fields[2].AsString,pointer(VersionNum));
TipNode.ImageIndex:=3;
TipNode.SelectedIndex:=4;
adoquery2.Next;
end;
end;
//注,VersionNum为0就行,
//写入数据库
procedure TForm1.SaveREditToDBase; //向数据库保存RichEdit中的内容
var
st: TMemoryStream;//
begin
StatusBar1.Panels[4].Text:='正在保存数据...';
//写入流
st := TMemoryStream.Create;
try
with RichEdit1 do
begin
//SelStart := 0;
//SelLength := Length(Text);
SelAttributes.Protected := FALSE;
Lines.SaveToStream(st);
end;
st.Position := 0;
with ADOQuery2 do
Begin
close;
SQL.Clear;
SQL.Add('select * from issue where subtitle=' + QuotedStr(CURRsubtitle));
Prepared;
Open;
Edit;
TBlobField(FieldByName('content')).LoadFromStream(st);
Post;
end;
finally
st.Free;
end;
StatusBar1.Panels[4].Text:='';
end;
//其中有些是测试用的代码,你删除就行了。
 
to kifo:
用select语句无法写入内容,错误提示“SmartQuery1 : can't not modify a read-only
dataset ”。我将SmartQuery1 readonly 属性改为false,仍不行.
 
我已经可以存贮了,但是不能用wwDBRichEditMSWord1显示出来,请各位高手帮忙。
//存贮
insert into table(blob) values(empty_blob());
select blob from table where xxx=xxx for update;
update table set blob=:xxx where xxx=xxx;
prepare;
ParamByName('XXX').DataType:=ftOraBlob;
ParamByName('xxx').ParamType:=ptInput;
ParamByName('xxx').LoadFromstream(ms,ftoraBlob);
//显示
如上
 
试着先将数据表中的文件数据保存到一个临时表中,RichEdit再从临时表中载入。
 
我的做法:
在存储时,以TABLE的方式操作,对blob字段以loadfromfile的方式写入内容,然后POST。
在提取时,同样,以savetofile将blob字段的内容先写入到一临时文件,然后再进行操作。
 
用query也可以(如原问题所示),但就是在ORA里需指定blob存贮空间,
因为我将blob型改为long raw时用以上语句就没有问题了。不知各如何指定
blob型的存贮空间.
 
我不清楚你所说的[red]"在ORA里需指定blob存贮空间"[/red]正确含义!
这是后台数据库要进行的设置,和前台的应用软件应该没有关系!
 
to armyjiang
没错是要在后台数据库里设置,就是在建立数据库表的时候指定其存贮空间。
 
我原来的想法是不调用word来显示数据库文档内容,也能实现,但就是有个问题表格格式会改变
所以已经放弃使用该方法。改用调用word来显示文档内容。调用时有时可以,有时不行,错误提示
‘遇到一个microsoft软件安装错误’。不知问题何在????
 
faint,使用db2的时候,adotable保存blob不行!!!
 
我是用BCB5. 類似的作法絕對可以.
我用BDE, 一定記得將其存放空間和緩沖區大小調成預設的10 倍左右一定行的.
 
我不用bde,我用adoc.我现在调用word,一次行,一次不行。错误提示为:遇到一个microsoft软件安装错误’。不知问题何在????
代码如下:
try
Wordapplication.Connect;
except
Wordapplication.Disconnect;
MessageDlg('连接word出错', mtError, [mbOk], 0);
Abort;
end;
Wordapplication.Visible := True;
WordApplication.Caption := 'xxxxx';
   WordApplication.Documents.Open(FileName, ConfirmConversions,
ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format,encoding,visoble);
   ItemIndex := 1;
WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));
WordApplication.Options.CheckSpellingAsYouType := False;
WordApplication.Options.CheckGrammarAsYouType := False;

运行到一次成功之后,关闭word后,再次运行支Wordapplication.Connect 就停了,出现如上所说的提示。或第一次不成功
停在Wordapplication.Connect。再次运行就成功了。
 
多人接受答案了。
 
后退
顶部