读书人

ADOQuery怎样SaveToStream解决思路

发布时间: 2012-02-21 16:26:23 作者: rapoo

ADOQuery怎样SaveToStream
象ADOQuery.SaveToFile那样SaveToStream的功能

[解决办法]
function RecordsetToMS(const Recordset: _Recordset; Stream: TMemoryStream): boolean;
var
RS: Variant;
begin
Result := false;
if Recordset = nil then Exit;

try
RS := CreateOleObject( 'ADODB.Recordset ');
RS := Recordset;
RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG);
Stream.Position := 0;
Result := true;
finally
;
end;
end;


function RecordsetFromMS(Stream: TMemoryStream): _Recordset;
var
RS: Variant;
begin
Result := nil;
if Stream.Size < 1 then Exit;
try
Stream.Position := 0;
RS := CreateOleObject( 'ADODB.Recordset ');
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result := IUnknown(RS) as _Recordset;
finally
;
end;
end;

[解决办法]
扩展ADODataSet,增加方法LoadFromStream/SaveToStream/LoadFromString/SaveToString:
unit MyADODataSet;

interface

uses
Classes, ADODB, ADOInt, Variants;

type
TMyADODataSet = class(TADODataSet)
public
function LoadFromStream(Stream: TStream): Boolean;
function SaveToStream(Stream: TStream): Boolean;
function LoadFromString(const Value: string): Boolean;
function SaveToString(var Value: string): Boolean;
end;

procedure Register;

implementation

type
Recordset25 = interface(_Recordset)
[ '{00000556-0000-0010-8000-00AA006D2EA4} ']
procedure Save(Destination: OleVariant; PersistFormat: PersistFormatEnum); safecall;
end;

function TMyADODataSet.LoadFromStream(Stream: TStream): Boolean;
var
mRecordSet: _Recordset;
begin
Result := False;
Close;
DestroyFields;
mRecordSet := CoRecordset.Create;
try
if mRecordSet.State = adStateOpen then mRecordset.Close;
Stream.Position := 0;
mRecordset.Open(TStreamAdapter.Create(Stream) as IUnknown, EmptyParam, adOpenStatic, adLockBatchOptimistic, adAsyncExecute);
Stream.Position := 0;
if not mRecordSet.BOF then mRecordset.MoveFirst;
RecordSet := mRecordSet;
inherited OpenCursor(False);
Resync([]);
Result := True;
except
//
end;
end;

function TMyADODataSet.SaveToStream(Stream: TStream): Boolean;
var
mRecordSet: Recordset25;
begin
Result := False;
if Recordset = nil then Exit;
if Recordset.QueryInterface(Recordset25, mRecordSet) = 0 then
try
Stream.Position := 0;
mRecordSet.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML);
Stream.Position := 0;
Result := True;
except
//
end;
end;

function TMyADODataSet.LoadFromString(const Value: string): Boolean;
var
mStream: TStringStream;
begin
Result := False;
if Value = ' ' then Exit;
mStream := TStringStream.Create(UTF8Encode(Value));
try
LoadFromStream(mStream);
Result := True;
finally
mStream.Free;
end;
end;

function TMyADODataSet.SaveToString(var Value: string): Boolean;
var
mStream: TStringStream;
begin
Result := False;
mStream := TStringStream.Create( ' ');
try
SaveToStream(mStream);
mStream.Position := 0;


Value := Utf8ToAnsi(mStream.ReadString(mStream.Size));
Result := True;
finally
mStream.Free;
end;
end;

procedure Register;
begin
RegisterComponents( 'Standard ', [TMyADODataSet]);
end;

end.

读书人网 >.NET

热点推荐