首页 > 其他分享 >为bufdataset增加ftVariant支持

为bufdataset增加ftVariant支持

时间:2024-06-01 19:59:38浏览次数:27  
标签:CurrBuff begin end Buffer ftVariant 支持 else Field bufdataset

最近使用bufdataset时发现可以创建ftVariant类型,但无法正常读写。经搜索,发现fpc官方早在2011年就有解决方案,但到今天最新的fpc3.3.1还没支持,按issues的方法,经测试读写ok,如果你也需要在bufDataSet要用到ftVariant,可以参考以下方法:
打开fpcsrc\packages\fcl-db\src\base\bufdataset.pas
打到以下代码,添加红色的部分的代码:

function TCustomBufDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;

procedure TCustomBufDataset.SetFieldData(Field: TField; Buffer: Pointer);

 

function TCustomBufDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;

var
  CurrBuff : TRecordBuffer;
  vData    : variant;
begin
  Result := False;
  if State = dsOldValue then
  begin
    if FSavedState = dsInsert then
      CurrBuff := nil // old values = null
    else if GetActiveRecordUpdateBuffer then
      CurrBuff := FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer
    else
      // There is no UpdateBuffer for ActiveRecord, so there are no explicit old values available
      // then we can assume, that old values = current values
      CurrBuff := CurrentIndexBuf.CurrentBuffer;
  end
  else
    CurrBuff := GetCurrentBuffer;

  if not assigned(CurrBuff) then Exit; //Null value

  If Field.FieldNo > 0 then // If =-1, then calculated/lookup field or =0 unbound field
    begin
    if GetFieldIsNull(pbyte(CurrBuff),Field.FieldNo-1) then
      Exit;
    if assigned(Buffer) then
      begin
      inc(CurrBuff,FFieldBufPositions[Field.FieldNo-1]);
      if Field.IsBlob then // we need GetFieldSize for BLOB but Field.DataSize for others - #36747
        Move(CurrBuff^, Buffer^, GetFieldSize(FieldDefs[Field.FieldNo-1]))
      else
      if Field.DataType =ftVariant then
      begin
        vData:=PVariant(CurrBuff)^;
        PVariant(Buffer)^ := vData;
      end
      else
        Move(CurrBuff^, Buffer^, Field.DataSize);
      end;
    Result := True;
    end
  else
    begin
    Inc(CurrBuff, GetRecordSize + Field.Offset);
    Result := Boolean(CurrBuff^);
    if Result and assigned(Buffer) then
      begin
      inc(CurrBuff);
      Move(CurrBuff^, Buffer^, Field.DataSize);
      end;
    end;
end;

procedure TCustomBufDataset.SetFieldData(Field: TField; Buffer: Pointer;
  NativeFormat: Boolean);
begin
  SetFieldData(Field,Buffer);
end;

procedure TCustomBufDataset.SetFieldData(Field: TField; Buffer: Pointer);

var CurrBuff : pointer;
    NullMask : pbyte;
    vData    : variant;
begin
  if not (State in dsWriteModes) then
    DatabaseErrorFmt(SNotEditing, [Name], Self);
  CurrBuff := GetCurrentBuffer;
  If Field.FieldNo > 0 then // If =-1, then calculated/lookup field or =0 unbound field
    begin
    if Field.ReadOnly and not (State in [dsSetKey, dsFilter, dsRefreshFields]) then
      DatabaseErrorFmt(SReadOnlyField, [Field.DisplayName]);    
    if State in [dsEdit, dsInsert, dsNewValue] then
      Field.Validate(Buffer);    
    NullMask := CurrBuff;

    inc(CurrBuff,FFieldBufPositions[Field.FieldNo-1]);
    if assigned(buffer) then
    begin
      if Field.IsBlob then // we need GetFieldSize for BLOB but Field.DataSize for others - #36747
        Move(Buffer^, CurrBuff^, GetFieldSize(FieldDefs[Field.FieldNo-1]))
      else
      if Field.DataType =ftVariant then
      begin
        vData:=PVariant(Buffer)^;
        PVariant(CurrBuff)^ := vData;
      end
      else
         Move(Buffer^, CurrBuff^, Field.DataSize);
      unSetFieldIsNull(NullMask,Field.FieldNo-1);
    end
    else
      SetFieldIsNull(NullMask,Field.FieldNo-1);
    end
  else
    begin
    Inc(CurrBuff, GetRecordSize + Field.Offset);
    Boolean(CurrBuff^) := Buffer <> nil;
    inc(CurrBuff);
    if assigned(Buffer) then
    begin
      if Field.DataType =ftVariant then
      begin
        vData:=PVariant(Buffer)^;
        PVariant(CurrBuff)^ := vData;
      end
      else
        Move(Buffer^, CurrBuff^, Field.DataSize);
    end;
    end;
  if not (State in [dsCalcFields, dsFilter, dsNewValue]) then
    DataEvent(deFieldChange, PtrInt(Field));
end;

添加以上红色代码后,将bufdataset.pas拷贝到你的project的文件夹,重新编译project就可以了。

标签:CurrBuff,begin,end,Buffer,ftVariant,支持,else,Field,bufdataset
From: https://www.cnblogs.com/qiufeng2014/p/18226323

相关文章

  • [引]亚马逊云科技支持计划比较
    亚马逊云科技支持计划比较-亚马逊云科技(amazonaws.cn)CompareAmazonWebServicesSupportPlans亚马逊云科技支持计划比较所有客户均可获得亚马逊云科技账户附带的基本支持。所有计划(包括基本支持)均提供非技术客户服务,并支持访问亚马逊云科技文档和白皮书。......
  • sensitive-word 敏感词 v0.16.1 新特性支持字典内存资源释放
    敏感词系列sensitive-word-admin敏感词控台v1.2.0版本开源sensitive-word-adminv1.3.0发布如何支持分布式部署?01-开源敏感词工具入门使用02-如何实现一个敏感词工具?违禁词实现思路梳理03-敏感词之StopWord停止词优化与特殊符号04-敏感词之字典瘦身05-敏感词之DFA......
  • 在不受支持的 Mac 上安装 macOS Sonoma (OpenCore Legacy Patcher v1.5.0)
    在不受支持的Mac上安装macOSSonoma(OpenCoreLegacyPatcherv1.5.0)InstallmacOSonunsupportedMacs请访问原文链接:https://sysin.org/blog/install-macos-on-unsupported-mac/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org历时两个月,OpenCoreLegacyPat......
  • 淘宝API接口大全,实时数据接口且支持高并发请求不限制
    前言在开发测试阶段,或者是在写Demo的时候,难免会用到一些测试数据,有时苦于没有可用的接口,需要自己动手去写,但是这样大大降低了效率,前期我也找了一些封装好的接口,这篇文章整理一下,以下接口完全免费测试,返回格式全是JSON,所有接口均可无限制使用,有需要的小伙伴可以进来看看。 ......
  • uniapp实现图片上传——支持APP、微信小程序
    uniapp实现图片、视频上传文章目录uniapp实现图片、视频上传效果图组件templatejs使用相关文档:结合uView插件+uni.uploadFile实现u-uploaduploadfile效果图组件简单封装,还有很多属性…,自定义样式等…根据个人所需调整template<template> <view>......
  • Timing 技术支持文档
    TechnicalSupportDocument:TimingCountdownAppWelcomeWelcometotheTimingCountdownApp!ThisdocumentwillprovideyouwithcomprehensiveguidanceonhowtousetheTimingapp,includingitsfeatures,stepsforcustomizingtasks,andhowtoobtaint......
  • 【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实
    ......
  • 柬埔寨语翻译通App上架啦!支持高棉语翻译成中文,中柬互译,高棉语OCR文字识别提取,提高工作
    大家好!有个超级棒的消息要告诉大家——柬埔寨语翻译通小程序已经上架啦!不论你是安卓还是苹果用户,都可以轻松下载使用!只要微信搜一搜,翻译之路畅通无阻!这不仅仅是一个翻译工具,它还支持高棉语中文双语翻译,翻译结果支持语音朗读,翻译记录自动保存!跟着说跟着读,高棉语词汇轻松掌握......
  • 4款支持信创内网环境使用的国产办公软件,安全又好用
    随着信息技术的快速发展,信创(信息技术应用创新)已成为国家发展的重要战略。在这一背景下,国产办公软件迎来了发展的黄金时期。今天给大家分享4款支持信创内网环境使用的国产办公软件,它们不仅安全可靠,而且功能强大,非常好用。 一、石墨文档 石墨文档是一款功能强大的在线文档协作......
  • 3.4K Star!一个高性能的跨平台图表库!支持H5、APP、及各种小程序!太强了!
    大家好!我是赵老师,专门搜罗分享一些优秀开源项目、工具软件等以及进行一些原创技术分享和干货文章分享!喜欢的童鞋可以点个关注加在看,大家也可以在留言区进行探讨,谢谢啦!这是一款专为小程序而生的高性能跨平台图表库。它支持H5图表、APP图表以及各类小程序图表(包括微信小程序、......