TClientDataSet取得当前记录的数据包和刷新当前记录包
来源:互联网 发布:三维机械设计软件下载 编辑:程序博客网 时间:2024/06/06 08:28
TClientDataSet取得当前记录的数据包和刷新当前记录包
delphi本身并不提供当前记录的数据封包,但我们有一个途经可以获取,通过TDataSetProvieder的GetRecords获取。GetRecords虽然简单,但不能排除Blob字段、只取唯一主键字段等。通过研究CDS的RefreshRecord方法,提取了当前记录的封包。
Uses
DBClient,Variants,DSIntf;
type
TMyCDS = class(TCustomClientDataSet);//由于引用了Protected的一些方法和变量
/// <summary>
/// 获取当前记录的 OleVariant 封包
/// </summary>
/// <param name="CDS"></param>
/// <param name="Options"></param>
/// <returns></returns>
function GetRecordOleVar(CDS:TClientDataSet;Options:TFetchOptions):OleVariant;
var
DataPacket: TDataPacket;
NewData: OleVariant;
begin
{ Throw error if we are closed, but not if we are in the middle of opening }
if not Assigned(TMyCDS(CDS).DSCursor) then
TMyCDS(CDS).CheckActive;
TMyCDS(CDS).UpdateCursorPos;
TMyCDS(CDS).Check(TMyCDS(CDS).DSCursor.GetRowRequestPacket
(foRecord in Options, foBlobs in Options ,False, True, DataPacket));
DataPacketToVariant(DataPacket, NewData);
Result := NewData;
end;
假如服务端又返回一条记录的封包,怎样更新当前记录呢?
/// <summary>
/// 刷新当前记录
/// </summary>
/// <param name="CDS"></param>
/// <param name="OleVar">返回数据包</param>
procedure RefreshRecordByOleVar(CDS:TClientDataSet;OleVar:OleVariant);
begin
TMyCDS(CDS).UpdateCursorPos;
TMyCDS(CDS).Check(TMyCDS(CDS).DSCursor.RefreshRecord(VarToDataPacket(OleVar)));
if not TMyCDS(CDS).Active then
Exit;
TMyCDS(CDS).DSCursor.GetCurrentRecord(TMyCDS(CDS).ActiveBuffer);
TMyCDS(CDS).Resync([]);
end;
有了这两个方法,我们可以自定义刷新当前记录的方法。默认的RefreshRecord受限很多,而且效率不是很高。我们可以将当前记录(不含Blob字段,发送效率更高)发送到服务端,通过自定义的类似TUpdateSQL的刷新方法,结合DSP,然后将查询回来的记录打包,再通过刷新合并当前记录。
- TClientDataSet取得当前记录的数据包和刷新当前记录包
- TClientDataSet取得当前记录的数据包和刷新当前记录包
- 如何取得当前插入记录的ID
- 取得当前插入数据库中记录的id值
- PHP取得当前插入数据库中记录的id值
- PHP取得当前插入数据库中记录的id值
- 记录当前的感受
- 取当前记录行的后一行记录和前一行记录lead()和lag()
- 获得当前记录的上一条记录和下一条记录
- mysql 取出当前记录的上一条记录和下一条记录
- 当前目录和上一级目录的术语记录方法
- [abap] 刷新ALV定位到当前记录行
- 后台系统无刷新页面记录当前操作位置方法
- freemarker相对路径和记录当前时间
- UITableView 刷新头部时,头部每次都变为开始的状态,无法记录当前的状态
- 记录当前时间
- 简单记录当前情况
- 8.2.1显示记录总数和当前记录号[ODBC]
- PHP加密解密函数,适合PHP4、PHP5
- Shell生成序列
- 从无参方法、含参方法到重载方法
- 用引用返回值
- HDU 1520 Anniversary party(树形DP入门)
- TClientDataSet取得当前记录的数据包和刷新当前记录包
- windbg之使用!list指令遍历双向链表
- ios学习笔记block回调的应用(一个简单的例子)
- Linux 内核参数 和 Oracle相关参数调整
- android手机安装时缺少google map api 的解决方法
- U-BOOT源码分析及移植(转载)--嵌入式系统应用笔记
- ASP.NET中后台注册js脚本攻略
- 浅谈spring——自动创建代理(八)
- xml解析之DOM4j解析