var P: PChar; S: Integer; BS: TADOBlobStream; begin if not (ADOTable1.State in [dsEdit, dsInsert]) then ADOTable1.Edit; BS := TADOBlobStream.Create(TMemoField(ADOTable1.Fields[1]), bmWrite); try S := Memo1.GetTextLen; Inc(S); P := AllocMem(S); FillChar(P^, S, #0); Memo1.GetTextBuf(P, S); BS.Write(P^, S); finally BS.Free; FreeMem(P, S); end;end;
是把整个TADODataSet的内容保存到流里,既实现TClientDataSet.Data功能!
procedure TForm1.Button1Click(Sender: TObject); var cs : TMemoryStream; begin cs := TMemoryStream.Create ; ADOQuery1.SaveToFile('c:\s.xml',pfXML); cs.LoadFromFile('c:\s.xml'); ..... cs.Free; end;
procedure TForm1.Button1Click(Sender: TObject); var sm: TMemoryStream; ADOQuery2 : TADOQuery; begin sm := TMemoryStream.Create ; sm.WriteComponent(ADOQuery1); sm.Seek(0,soFromBeginning); ADOQuery2 :=sm.ReadComponent(nil) as TADOQuery;end;initialization RegisterClasses(TADOQuery); end.
to sz1008你的这种方法能把数据保存在流里吗?我看好想不行,因为ADOExpress是对MS ADO接口的封装 而不是直接管理内存数据。
P: PChar;
S: Integer;
BS: TADOBlobStream;
begin
if not (ADOTable1.State in [dsEdit, dsInsert]) then
ADOTable1.Edit;
BS := TADOBlobStream.Create(TMemoField(ADOTable1.Fields[1]), bmWrite);
try
S := Memo1.GetTextLen;
Inc(S);
P := AllocMem(S);
FillChar(P^, S, #0);
Memo1.GetTextBuf(P, S);
BS.Write(P^, S);
finally
BS.Free;
FreeMem(P, S);
end;end;
var cs : TMemoryStream;
begin
cs := TMemoryStream.Create ;
ADOQuery1.SaveToFile('c:\s.xml',pfXML);
cs.LoadFromFile('c:\s.xml');
.....
cs.Free;
end;
var sm: TMemoryStream;
ADOQuery2 : TADOQuery;
begin
sm := TMemoryStream.Create ;
sm.WriteComponent(ADOQuery1);
sm.Seek(0,soFromBeginning);
ADOQuery2 :=sm.ReadComponent(nil) as TADOQuery;end;initialization
RegisterClasses(TADOQuery);
end.
而不是直接管理内存数据。