var
mslr,msda:tmemorystream;
begin
panel4.Enabled:=true;
n15.Enabled:=true;
mslr:=tmemorystream.Create;
msda:=tmemorystream.Create;
olecontainer1.SaveToStream(mslr);
olecontainer2.SaveToStream(msda);
clientdataset2.Edit;
clientdataset2lr.LoadFromStream(mslr);
clientdataset2lrda.LoadFromStream(msda);
clientdataset2.fieldbyname('tmm').asstring:=TabControl1.tabs[tabcontrol1.tabindex]+inttostr(clientdataset2.fieldbyname('tid').asinteger);
clientdataset2.post;
clientdataset2.applyupdates(-1);
mslr.Free;
msda.Free;
end;上面是我以前写的保存的例子没有用问题的,可以。
mslr,msda:tmemorystream;
begin
panel4.Enabled:=true;
n15.Enabled:=true;
mslr:=tmemorystream.Create;
msda:=tmemorystream.Create;
olecontainer1.SaveToStream(mslr);
olecontainer2.SaveToStream(msda);
clientdataset2.Edit;
clientdataset2lr.LoadFromStream(mslr);
clientdataset2lrda.LoadFromStream(msda);
clientdataset2.fieldbyname('tmm').asstring:=TabControl1.tabs[tabcontrol1.tabindex]+inttostr(clientdataset2.fieldbyname('tid').asinteger);
clientdataset2.post;
clientdataset2.applyupdates(-1);
mslr.Free;
msda.Free;
end;上面是我以前写的保存的例子没有用问题的,可以。
Mem:TMemoryStream;
Mem := TMemoryStream.Create;
Mem.LoadFromFile(FileName);
Mem.Seek(0,soFromBeginning);
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO BLOBNAME(NAME,FILENAMES) VALUES(:NAME,:FILENAMES)');
Query1.ParamByName('Name').AsString := FileName;
Query1.ParamByName('FileNAMES').LoadFromStream(Mem,ftBlob);
Query1.ExecSQL;
Mem.Free;
ClientDataSet1.Append;
ClientDataSet1.FieldByName('ID').AsInteger := 1;
ClientDataSet1.FieldByName('Name').AsString := 'Borlandor';
Stream := TMemoryStream.Create;
Image1.Picture.Graphic.SavetoStream(Stream);
Stream.Position := 0;
ClientDataSet1.FieldByName('Photo').LoadFromStream(Stream);
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(-1);
Stream.free;
end;友情提醒:
三层的Blob数据不能依靠ClientDataSet1.CommandText中的SQL语句插入,
只能依靠上面这种“字段+流”的方式来实现。
二层的可以参见cg1120提供的方式来实现,当然也可使用“字段+流”的方式。
var MemoryStream:TMemoryStream;
begin
MemoryStream:= TMemoryStream.Create;
try
TBlobField(cds_data.FieldByName('sqwd')).SaveToStream(MemoryStream);
MemoryStream.Position := 0;
OleContainer1.LoadFromStream(MemoryStream);//执行到此,出错!
//OleContainer1.Refresh;
finally
MemoryStream.Free;
end;
而且如果是,你应该用TOLEStream而不是TMemoryStream.
程序1。(保存到数据库)
============
var MemoryStream:TMemoryStream;
begin
MemoryStream:= TMemoryStream.Create;
try
OleContainer.SaveToStream(MemoryStream);
MemoryStream.Position := 0;
cds.Edit;
TBlobField(cds.FieldByName(fieldname)).LoadFromStream(MemoryStream);
cds.Post;
finally
MemoryStream.Free;
end;
=================================
程序2。(从数据库中取出,更新OleContainer内容)
============
var MemoryStream:TMemoryStream;
begin
MemoryStream:= TMemoryStream.Create;
try
TBlobField(cds.FieldByName(fieldname)).SaveToStream(MemoryStream);
MemoryStream.Position := 0;
OleContainer.LoadFromStream(MemoryStream);//出错处!!(错误提示'Stream read error'!对刚保存过数据无误,但重新启动打开时有误)
//OleContainer.Refresh;
finally
MemoryStream.Free;
end;
==============
根据错误提示(对刚保存过数据无误,但重新启动打开时有误)我做出判断:
1。数据未保存;
2。流的类型错误。望您指教!
var MemoryStream:TMemoryStream;
begin
ClientDataSet1.Open;
MemoryStream:= TMemoryStream.Create;
try
OleContainer1.SaveToStream(MemoryStream);
MemoryStream.Position := 0;
ClientDataSet1.First;
ClientDataSet1.Edit;
TBlobField(ClientDataSet1.FieldByName('Photo')).LoadFromStream(MemoryStream);
//ClientDataSet1Photo.LoadFromStream(MemoryStream);
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(-1);//这句是必须的。 finally
MemoryStream.Free;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var MemoryStream:TMemoryStream;
begin
MemoryStream:= TMemoryStream.Create;
try
TBlobField(ClientDataSet1.FieldByName('Photo')).SaveToStream(MemoryStream);
MemoryStream.Position := 0;
OleContainer2.LoadFromStream(MemoryStream);//不出错,内容正确!
//OleContainer.Refresh;
finally
MemoryStream.Free;
end;end;
友情提醒:
Delphi BDE中的TQuery组件不支持Oracle某些版本Blob数据的读写。
必须以TTable来代替。