序列化ADODataSet, ADOQuery
Posted zyb2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化ADODataSet, ADOQuery相关的知识,希望对你有一定的参考价值。
服务端直接将TADOQuery查询出来的数据直接转换成TStream自己进行传递,到客户端用一个TADOQuery对象还原流就可以了。
方法一
是将recordset保存成流接口->转成OleVariant ->写入流
class
function
TADOTools
.
saveToStream2(
pvDataSet: TCustomADODataSet): TMemoryStream;
var
AStream:_Stream;
V:OLEVariant;
P:
Pointer
;
begin
AStream:=CoStream
.
Create;
OLEVariant(pvDataSet
.
Recordset).Save(AStream, adPersistADTG);
AStream
.
Position:=
0
;
V:=AStream
.
Read(AStream
.
Size);
result:=TMemoryStream
.
Create;
try
P:=VarArrayLock(V);
try
result
.
Size:=VarArrayHighBound(V,
1
)+
1
;
Move(P^,result
.
Memory^, result
.
Size);
finally
VarArrayUnLock(V);
end
;
except
result
.
Free();
result :=
nil
;
raise
;
end
;
end
;
class
procedure
TADOTools
.
loadFromStream2(pvDataSet: TCustomADODataSet;
pvStream: TMemoryStream);
var
V:OLEVariant;
AR:_Recordset;
AStream:_Stream;
P:
Pointer
;
begin
pvStream
.
Position:=
0
;
OLEVariant(pvDataSet
.
Recordset).Open(TStreamAdapter
.
Create(pvStream)
as
IUnknown, adPersistADTG);
AR
.
Open(AStream, EmptyParam,adOpenUnspecified, adLockUnspecified, -
1
);
pvDataSet
.
Recordset:=ADOInt
.
_Recordset(AR);
V:=VarArrayCreate([
0
,pvStream
.
Size-
1
], varByte);
P:=VarArrayLock(V);
try
Move(pvStream
.
Memory^, P^, pvStream
.
Size);
finally
VarArrayUnLock(V);
end
;
AStream:=CoStream
.
Create;
AStream
.
Open(EmptyParam,adModeUnknown,adOpenStreamUnspecified,
‘‘
,
‘‘
);
AStream
.
Type_:=adTypeBinary;
AStream
.
Write
(V);
AR:=_Recordset(CoRecordset
.
Create);
AStream
.
Position:=
0
;
AR
.
Open(AStream,EmptyParam,adOpenUnspecified, adLockUnspecified, -
1
);
pvDataSet
.
Recordset:=ADOInt
.
_Recordset(AR);
end
;
方法二
class
procedure
TADOTools
.
saveToStream(pvDataSet: TCustomADODataSet; pvStream:TStream);
begin
OLEVariant(pvDataSet
.
Recordset).Save(TStreamAdapter
.
Create(pvStream)
as
IUnknown,
adPersistADTG);
//adPersistXML
end
;
class
procedure
TADOTools
.
loadFromStream(pvDataSet: TCustomADODataSet;
pvStream: TStream);
var
AR:_Recordset;
begin
AR:=_Recordset(CoRecordset
.
Create);
pvStream
.
Position:=
0
;
AR
.
Open(TStreamAdapter
.
Create(pvStream)
as
IUnknown, EmptyParam,adOpenUnspecified, adLockUnspecified, -
1
);
pvDataSet
.
Recordset:=ADOInt
.
_Recordset(AR);
end
;
以上是关于序列化ADODataSet, ADOQuery的主要内容,如果未能解决你的问题,请参考以下文章
delphi怎样在ADO里用ADOproc调用数据库sql server存储过程?,用ADODATASET或者ADOQUERY又怎样调用存储过程?
DELPHI中 screen.Cursor:=crhourglass; adoQuery.close; adoquery.Open; screen.Cursor:=crdefault;啥意思(示例代码