经过昨天晚上一折腾把做了一个DIOCP直接传递TADOQuery的Demo,在google上找了一系列的资料。

这样服务端可以直接将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:=;
V:=AStream.Read(AStream.Size);
result:=TMemoryStream.Create;
try
P:=VarArrayLock(V);
try
result.Size:=VarArrayHighBound(V,)+;
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:=;
OLEVariant(pvDataSet.Recordset).Open(TStreamAdapter.Create(pvStream) as IUnknown, adPersistADTG); AR.Open(AStream, EmptyParam,adOpenUnspecified, adLockUnspecified, -);
pvDataSet.Recordset:=ADOInt._Recordset(AR); V:=VarArrayCreate([,pvStream.Size-], 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:=;
AR.Open(AStream,EmptyParam,adOpenUnspecified, adLockUnspecified, -);
pvDataSet.Recordset:=ADOInt._Recordset(AR); end;

今天稍微改造了下变得简单了

直接调用recordset保存成流借用TStreamAdapter

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:=;
AR.Open(TStreamAdapter.Create(pvStream) as IUnknown, EmptyParam,adOpenUnspecified, adLockUnspecified, -);
pvDataSet.Recordset:=ADOInt._Recordset(AR);
end;

序列化ADODataSet, ADOQuery的更多相关文章

  1. ADODataSet与ADOQuery的区别

    ADODataSet组件  此组件功能是非常强大的,通过ADODataset,可以直接与一个表进行联接,也可以执行SQL语句,还可以执行存储过程,可以说集ADOTable. ADOQuery.   A ...

  2. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

  3. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  4. 用dubbo时遇到的一个序列化的坑

    首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...

  5. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  6. Unity 序列化 总结

    查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...

  7. [C#] C# 知识回顾 - 序列化

    C# 知识回顾 -  序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...

  8. Newtonsoft.Json设置类的属性不序列化

    参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...

  9. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

随机推荐

  1. [POST] What Is the Linux fstab File, and How Does It Work?

    If you’re running Linux, then it’s likely that you’ve needed to change some options for your file sy ...

  2. NYOJ----蛇形填数

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 ...

  3. html锚点定位不准确问题

    问题描述 当顶部固定时,点击锚点,会跳转到锚点以下. <style> #one,#two,#three{ height: 500px; } #top{ position: fixed; h ...

  4. linux c学习笔记----线程创建与终止

    进程原语 线程原语 描述 fork pthread_create 创建新的控制流 exit pthread_exit 从现有的控制流中退出 waitpid pthread_join 从控制流中得到退出 ...

  5. VC设置视图背景颜色方法

    视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW是一致的.设计者一般会希望自己的程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景.我们可以用Wind ...

  6. wxml解析

    一.数据绑定 wxml中的动态数据均来自于对应js文件中的Page的data,在js中访问Page的data用this.data, 改变data中某个属性的值用setData()方法. Page({ ...

  7. Win10企业版转专业版

    原文地址:https://jingyan.baidu.com/article/86112f136624322737978797.html 转换ISO镜像下载地址: ed2k://|file|cn_wi ...

  8. 安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()

    1.在AndroidManifest.xml中添加如下代码 <?xml version="1.0" encoding="utf-8"?> <m ...

  9. [ACM] hdu 1253 胜利大逃亡 (三维BFS)

    胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示 ...

  10. js事件之event.preventDefault()与(www.111cn.net)event.stopPropagation()用法区别

    event.preventDefault()用法介绍 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit" ...