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

取clientdatasetdetal中的更新数据,将detal转数据库脚本sql

转自永南博客,更改update脚本只取变化字段,更改排除blob与数组字段,这两个类型会报错functionvartosql(value:Variant):wideString;vartm

转自永南博客,更改update 脚本只取变化字段,更改排除blob与数组字段,这两个类型会报错


function vartosql(value: Variant): wideString;

var
  tmp: widestring;
begin
  if (varisnull(Value)) or (varisempty(Value)) then
    Result := 'NULL'
  else
    case Vartype(value) of
      varDate:
        begin
          tmp := formatDatetime('yyyy-mm-dd hh:mm:ss', VartoDatetime(Value));
          Result := Quotedstr(tmp);
        end;
      varString, varOlestr:
        Result := Quotedstr(Trim(Vartostr(Value)));
      varboolean:
        begin
          if Value then
            Result := '1'
          else
            Result := '0';
        end;
      varSmallint, varInteger, varDouble, varShortInt, varInt64, varLongWord, varCurrency:
        begin
          Result := trim(Vartostr(Value));
        end;
    else
      Result := Quotedstr(Trim(Vartostr(Value)));
    end;
end;




function GetCdsDetail(cdsDelta: TClientDataSet; TableName, KeyField, vWhere: WideString): WideString;
var
  i: integer;
  s1, s2: string;
  CmdStr: string;
  lcds: TClientDataSet;
begin
  Result := '';


  if (not cdsDelta.Active) and (cdsDelta.ChangeCount <= 0) then
    Exit;
  CmdStr := 'select * from '+TableName+' where 1=2' ;
  lcds := TClientDataSet.Create(nil);
  lcds.Data := Form1.SocketConnection1.AppServer.getdata('MPL', cmdstr);
  for i := 1 to lcds.FieldCount do
    if cdsDelta.FindField(lcds.Fields[i - 1].FieldName) <> nil then
      cdsDelta.FindField(lcds.Fields[i - 1].FieldName).Tag := 1;
  lcds.Close;
  if cdsDelta.RecordCount > 0 then
  begin
    cdsDelta.First;
    s1 := '';
    s2 := '';
    while not cdsDelta.Eof do
    begin
      CmdStr := '';
      case cdsDelta.UpdateStatus of
        usUnmodified:
          begin
            s2 := VarToSql(cdsDelta[KeyField]);
          end;
        usModified:
          begin
            s1 := '';
            s2 := vWhere;
            for i := 1 to cdsDelta.FieldCount do
                     // if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then

             if  (not cdsDelta.Fields[i - 1].IsBlob) and (not  VarIsArray(cdsDelta.Fields[i - 1].Value)) then
              if (cdsDelta.Fields[i - 1].NewValue <> Variants.Unassigned) and (cdsDelta.Fields[i - 1].Tag = 1)
              and (cdsDelta.Fields[i - 1].OldValue <> cdsDelta.Fields[i - 1].NewValue) then
              begin
                if s1 = '' then
                  s1 := Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].Value)
                else
                  s1 := s1 + ',' + Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].Value);
              end;
            if s1 <> '' then
            begin
              CmdStr := 'Update ' + TableName + ' Set ' + s1 + ' Where ' + KeyField + ' = ' + s2;
            end;
          end;
        usInserted:
          begin
            s1 := '';
            s2 := '';
            for i := 1 to cdsDelta.FieldCount do
              if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then
              begin
                if s1 = '' then
                begin
                  s1 := Trim(cdsDelta.Fields[i - 1].FieldName);
                  s2 := VarToSql(cdsDelta.Fields[i - 1].Value);
                end
                else
                begin
                  s1 := s1 + ',' + Trim(cdsDelta.Fields[i - 1].FieldName);
                  s2 := s2 + ',' + VarToSql(cdsDelta.Fields[i - 1].Value);
                end;
              end;
            if s1 <> '' then
            begin
              CmdStr := 'Insert into ' + TableName + '(' + s1 + ') Values (' + s2 + ')';
            end;
          end;
        usDeleted:
          begin
            s2 := VarToSql(cdsDelta[KeyField]);
            CmdStr := 'Delete ' + TableName + ' Where ' + KeyField + ' = ' + s2;
          end;
      end;
      Result := Result + CmdStr + #13#10;
      cdsDelta.Next;
    end;
  end;
    FreeAndNil(lcds);
end;
推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
author-avatar
伊利纯羊毛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有