转自永南博客,更改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;

 
 
http://blog.csdn.net/y281252548/article/details/53332584

取clientdataset detal中的 更新数据, 将detal 转 数据库脚本sql的更多相关文章

  1. echarts异步数据加载(在下拉框选择事件中异步更新数据)

    接触echarts 大半年了,从不会到熟练也做过不少的图表,隔了一段时间没使用这玩意,好多东西真心容易忘了.在接触echarts这期间也没有总结什么东西,今天我就来总结一下如何在echart中异步加载 ...

  2. Apex 中插入更新数据的事件执行顺序

    在使用 Apex 代码插入或更新数据的时候,若干事件会被按顺序执行.了解这些顺序可以提高调试程序的效率,也可以避免不必要的错误. 可以参考官方文档. 事件的执行顺序 从数据库中读取要更新的数据记录或初 ...

  3. scrapy项目3:爬取当当网中机器学习的数据及价格(spider类)

    1.网页解析 当当网中,人工智能数据的首页url如下为http://category.dangdang.com/cp01.54.12.00.00.00.html 点击下方的链接,一次观察各个页面的ur ...

  4. 根据从redis缓存的数据查询出来,在从数据库中取出所有的数据,俩个数据进行比较,去掉重复,剩下库中新插入的数据,取出新数据,然后把redis中的缓存数据清空把从数据库中查出来的所有数据放到redis缓存中

    参考代码: public String getNewCenter(HttpServletRequest request,HttpServletResponse resonse){ JSONObject ...

  5. 爬取网贷之家平台数据保存到mysql数据库

    # coding utf-8 import requests import json import datetime import pymysql user_agent = 'User-Agent: ...

  6. telerik:RadGrid 在表格中编辑更新数据

    对于 telerik 这个框架 我也不是很熟悉 也是刚刚开始学习  有兴趣的可以去官网看下 https://www.telerik.com/ 啥也不多说 直接上代码 首先是 telerik:RadGr ...

  7. scrapy项目4:爬取当当网中机器学习的数据及价格(CrawlSpider类)

    scrapy项目3中已经对网页规律作出解析,这里用crawlspider类对其内容进行爬取: 项目结构与项目3中相同如下图,唯一不同的为book.py文件 crawlspider类的爬虫文件book的 ...

  8. mysql中实现更新数据+1,再次更新数据-1

    $sql="update article set comment=comment^1 where a_id=2"; 这条语句你会发现当你更新comment字段时为1,再次更新时为0 ...

  9. magento中取不同store中的产品数据

    $products = Mage::getResourceModel('catalog/product_collection')                    ->setStoreId( ...

随机推荐

  1. 【霍夫曼树】poj 1339 poker card game (数组排序+辅助队列的方法,预处理O(nlogn),构造霍夫曼树O(n))

    poj.org/problem?id=1339 #include<iostream> #include<cstdio> #include<string> #incl ...

  2. 【loj6029】「雅礼集训 2017 Day1」市场

    题目 题意:四种操作,区间加法.区间除法(下取整).区间求最小值.区间求和. 第1.3.4个操作都是摆设,关键在于如何做区间除法. 很明显不能直接把区间的和做除法后向下取整,因为区间和可能会多凑出一个 ...

  3. uva 11806 容斥原理+dfs

    In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...

  4. mongodb的入门CURD

    mongodb的入门CURD #查看所有数据库show dbs;show databases; #有些版本可能不行 #使用数据库use 数据库名 #查看集合(集合即mysql的表)show table ...

  5. linux的sar命令未找到

    linux的sar命令未找到 一般的命令可以直接使用yum安装,但是sar和mpstat命令这两个命令都是在sysstat包里, 网上的解决方法:rpm -ivh gd-2.0.32-23.2.i58 ...

  6. IOC基本理解

    什么是IOC? IOC全称为控制反转(Inversion Of Control),别名依赖注入(Dependency Injection). 控制反转即指我们获取依赖的方式发生了反转. 假设存在如下情 ...

  7. java 文件复制操作

    本案例采用第三方 jar 包完成,commons-io-2.5.jar, 这个 jar 对文件操作非常方便,大家可以尝试使用一下. 这里贴一个简单的 demo 供大家使用 import java.io ...

  8. Executors

    提供了工厂方法: Factory and utility methods for Executor, ExecutorService, ScheduledExecutorService, Thread ...

  9. Java中jshell脚本

    1.当所编写的代码量少时,倘若要按照步骤会显得繁琐,可直接用JDk当中的jshell,进入cmd,输入jshell,即进入jshell脚本交互模式.省去繁琐的定义类,main方法,可直接输出Syste ...

  10. docker日志输出文件大小设置以及文件个数限制

    问题描述: 今天有同事运行了一个docker容器,不多时就导致宿主机硬盘直接撑爆,消耗了120G,发生的很是突然. 问题排查: 后续查阅资料,发现是因为docker中的某个进程一直在持续输出,而这些输 ...