热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AdoDataSetRecordSet的序列化与反序列化技术解析

本文深入探讨了AdoDataSetRecordSet的序列化与反序列化技术,详细解析了将RecordSet转换为XML格式的方法。通过使用Variant类型变量和TStringStream流对象,实现数据集的高效转换与存储。该方法不仅提高了数据传输的灵活性,还增强了数据处理的兼容性和可扩展性。
//数据集串行化

function RecordsetToXML(const Recordset: _Recordset): string;
var
  RS: Variant;
  Stream: TStringStream;
begin
  Result := ‘‘;
  if Recordset = nil then Exit;

  Stream := TStringStream.Create(‘‘);
  try
    RS := Recordset;
    // adPersistADTG保存为二进制文件  adPersistXML保存为xml。二进制的传输效率要高于XML
    RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG);
    Stream.Position := 0;
    Result := Stream.DataString;
  finally
    Stream.Free;
  end;
end;

 

StrXML := RecordsetToXML(FAdoQuery.Recordset);

//压缩数据,注意压缩比率不要选择最高
      IsCompress := ECLCompressAndEncryptString(StrXML, OutStr, passWord, CompressionLevel, false);
      if IsCompress then
      begin

//格式化为16进制字符串
        CompressStr := StrtoFormat(pChar(OutStr), Length(OutStr), fmtHEX);

//告诉接收方将要发送数据的长度
        AThread.Connection.WriteInteger(Length(CompressStr));
        Stream := TStringStream.Create(CompressStr);

//发送数据
        AThread.Connection.WriteStream(Stream, True);
        Stream.Free;

 

//还原数据集

function RecordsetFromXML(const XML: string): _Recordset;
var
  RS: Variant;
  Stream: TStringStream;
begin
  Result := nil;
  if XML = ‘‘ then Exit;

  try
    Stream := TStringStream.Create(XML);
    Stream.Position := 0;
    RS := CreateOleObject(‘ADODB.Recordset‘);
    RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
    Result := IUnknown(RS) as _Recordset;
  finally
    Stream.Free;
  end;
end;

 

procedure TTCPAdoClient.Open(Value : String);
var HexStr, DecStr: String;       
  Stream : TStringStream;  Lenbuf : Integer;
begin
  Value := Uppercase(Value);
  FIdTCPClient.WriteLn(‘SELECTSQL: ‘ + Value);
  FCommand := Value;
  Application.ProcessMessages;
  if not FIdTCPClient.Connected then
    exit;
  LenBuf := FIdTCPClient.ReadInteger;
  Stream := TStringStream.Create(‘‘);
  try

//读取数据
    FIdTCPClient.ReadStream(Stream, LenBuf, False);

    HexStr := FormatToStr(pChar(Stream.DataString), Length(Stream.DataString), fmtHEX);

//解压缩数据
    ECLDecompressAndDecryptString(HexStr, DecStr, passWord);
    Application.ProcessMessages;
//还原数据集
    FRecordSet :=  RecordsetFromXML(DecStr);
  finally
    Stream.Free;
  end;
  RecordSet := FRecordSet;
end;

AdoDataSet.RecordSet的串行化和还原(转载)


推荐阅读
  • Dapper:一款高效轻量的ORM框架
    Dapper 是一个高效且轻量级的 ORM(对象关系映射)框架,由 StackExchange 开发并维护。它旨在提供快速的数据访问性能,同时保持代码的简洁性和易用性。Dapper 可以显著提高开发效率,特别适用于需要高性能数据操作的应用场景。更多详细信息可参考其官方文档和 GitHub 仓库。 ... [详细]
  • 本文深入探讨了Windows操作系统中线程同步机制的关键技术,重点分析了`WaitForSingleObject`和`Event`的使用方法及其应用场景。通过详细介绍`CreateEvent`函数的创建过程及其在判断线程退出和实现线程间同步中的重要作用,结合具体实例,展示了如何高效地利用这些工具来解决多线程编程中的常见问题。此外,文章还讨论了这些机制在实际开发中的最佳实践和注意事项,为开发者提供了宝贵的参考。 ... [详细]
  • 题目要求在给定的数组中找到一个连续子数组,使其乘积最大。本文详细介绍了使用动态规划算法解决这一问题的方法,包括状态定义、状态转移方程和初始化步骤。通过具体的例子和代码实现,帮助读者深入理解该算法的核心思想和实现细节。 ... [详细]
  • 触发器是数据库中一种特殊类型的存储过程,其执行依赖于预定义的事件,而非直接调用。在数据库管理中,触发器主要用于实现数据完整性、自动化日志记录及复杂业务规则的执行。当对数据库中的表、视图等对象进行插入、更新或删除操作时,系统将自动激活相关的触发器,以确保数据的一致性和安全性。此外,通过合理设计和优化触发器,还可以显著提升数据库性能和响应速度。 ... [详细]
  • Tornado硬件管理平台中的设备信息采集技术深入解析(三)
    深入解析 Tornado 硬件管理平台中的设备信息采集技术,本文聚焦于 `monitor.py` 脚本的关键字段分析。该脚本通过导入 `psutil`、`time` 和 `datetime` 模块,以及使用 `pprint` 进行数据格式化输出,实现对系统资源和设备状态的高效监控与数据采集。 ... [详细]
  • 如何在SharePoint 2013中使用不同用户身份进行登录操作
    在创建了SharePoint 2013网站后,我注意到其界面与2010版本有所不同,特别是缺少了“以其他用户身份登录”的功能,这对测试工作造成了不便。通过查阅一些国外的技术资源,最终找到了有效的解决方案。这一方法不仅解决了登录问题,还提升了多用户环境下的测试效率和安全性。 ... [详细]
  • 本文探讨了在 SQL 中将中文字符转换为拼音首字母的有效方法和技巧。通过使用特定的函数和算法,可以实现中文名称的快速拼音首字母提取,从而提高数据处理的效率和准确性。文中还提供了具体的示例和代码片段,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本研究聚焦于智能图库管理和高清摄影功能的优化。通过集成系统预设的多媒体参数,利用 `UIImagePickerController` 实现了高效的拍照和系统相册访问功能。系统会自动检测设备的兼容性,并提供用户友好的界面以确保最佳的使用体验。此外,我们还引入了先进的图像处理算法,进一步提升了照片质量和存储效率。 ... [详细]
  • 【SharePoint】详解搜索服务Search Service的配置步骤(上篇)
    在 SharePoint 2013 中,若需启用搜索服务,首先应创建一个搜索服务实例,然后启动该服务。若直接尝试启动服务而未先创建实例,系统将显示错误提示。创建搜索服务的具体步骤包括:进入“应用程序管理”下的“管理服务应用程序”。此外,建议在创建实例前检查系统资源和权限设置,以确保服务的顺利运行。 ... [详细]
  • 在 Linux 环境下,深入探讨 GTK+3.0 的高级开发技巧,涵盖组件定制、事件处理及多线程应用等核心内容,帮助开发者提升应用界面的交互性和性能。 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • 【高效构建全面的iOS直播应用】(美颜功能深度解析)
    本文深入探讨了如何高效构建全面的iOS直播应用,特别聚焦于美颜功能的技术实现。通过详细解析美颜算法和优化策略,帮助开发者快速掌握关键技术和实现方法,提升用户体验。适合对直播应用开发感兴趣的开发者阅读。 ... [详细]
  • 使用Java生成10个随机数填充数组,并通过消息框展示数组元素及求和结果
    本文介绍了如何使用Java语言生成10个随机数并将其存储在一个数组中。随后,通过消息框展示数组的所有元素,并计算这些元素的总和,最终将求和结果一并在消息框中显示。具体实现时,可以通过 `Math.random()` 函数生成0到1000之间的随机数,确保每个数字的随机性和多样性。此外,为了提高代码的可读性和健壮性,建议使用循环结构来简化数组的填充和显示过程。 ... [详细]
  • OpenCV 2.4.9 源码解析:级联分类器的错误率与尺寸分析 ... [详细]
  • 通过Apache Commons FileUpload组件,可以根据具体应用需求实现多样化的文件上传功能。在基本应用场景中,开发者可以通过调用单一方法来解析Servlet请求,从而轻松处理文件上传任务。此外,该组件还提供了丰富的配置选项和高级功能,支持大文件上传、多文件并发处理等复杂场景,显著提升了文件上传的效率和可靠性。 ... [详细]
author-avatar
哥晕死_476
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有