取clientdataset detal中的 更新数据, 将detal 转 数据库脚本sql
转自永南博客,更改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;
取clientdataset detal中的 更新数据, 将detal 转 数据库脚本sql的更多相关文章
- echarts异步数据加载(在下拉框选择事件中异步更新数据)
接触echarts 大半年了,从不会到熟练也做过不少的图表,隔了一段时间没使用这玩意,好多东西真心容易忘了.在接触echarts这期间也没有总结什么东西,今天我就来总结一下如何在echart中异步加载 ...
- Apex 中插入更新数据的事件执行顺序
在使用 Apex 代码插入或更新数据的时候,若干事件会被按顺序执行.了解这些顺序可以提高调试程序的效率,也可以避免不必要的错误. 可以参考官方文档. 事件的执行顺序 从数据库中读取要更新的数据记录或初 ...
- scrapy项目3:爬取当当网中机器学习的数据及价格(spider类)
1.网页解析 当当网中,人工智能数据的首页url如下为http://category.dangdang.com/cp01.54.12.00.00.00.html 点击下方的链接,一次观察各个页面的ur ...
- 根据从redis缓存的数据查询出来,在从数据库中取出所有的数据,俩个数据进行比较,去掉重复,剩下库中新插入的数据,取出新数据,然后把redis中的缓存数据清空把从数据库中查出来的所有数据放到redis缓存中
参考代码: public String getNewCenter(HttpServletRequest request,HttpServletResponse resonse){ JSONObject ...
- 爬取网贷之家平台数据保存到mysql数据库
# coding utf-8 import requests import json import datetime import pymysql user_agent = 'User-Agent: ...
- telerik:RadGrid 在表格中编辑更新数据
对于 telerik 这个框架 我也不是很熟悉 也是刚刚开始学习 有兴趣的可以去官网看下 https://www.telerik.com/ 啥也不多说 直接上代码 首先是 telerik:RadGr ...
- scrapy项目4:爬取当当网中机器学习的数据及价格(CrawlSpider类)
scrapy项目3中已经对网页规律作出解析,这里用crawlspider类对其内容进行爬取: 项目结构与项目3中相同如下图,唯一不同的为book.py文件 crawlspider类的爬虫文件book的 ...
- mysql中实现更新数据+1,再次更新数据-1
$sql="update article set comment=comment^1 where a_id=2"; 这条语句你会发现当你更新comment字段时为1,再次更新时为0 ...
- magento中取不同store中的产品数据
$products = Mage::getResourceModel('catalog/product_collection') ->setStoreId( ...
随机推荐
- 【2018.11.23】2018WCTest(7)
向已退役学长致敬! 题目&他的题解 T1 一道睿智题目,正常思路就是时空复杂度均为 $O(n\times 32768)$ 的背包.这个做法不被卡时间却被卡空间,其实就是想让你离线处理询问,然后 ...
- 解决安卓SDK更新dl-ssl.google.com无法连接的方法
Q:解决安卓SDK更新dl-ssl.google.com无法连接的方法: A1.修改C:\windows\system32\dirvers\etc\hosts文件,将其复制到其他地方修改后替换回原来的 ...
- Aragorn's Story(hdu3966)
题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...
- 标准C程序设计七---12
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 使用nginx时,让web取得原始请求地址
问题描述 当使用nginx配置proxy_pass参数以后,后端web取得的Request.Uri是proxy_pass中配置的地址,而不是client访问的原始地址 举例说明: 假设nginx配置文 ...
- python在webservice接口测试中的应用
接口测试第二波,webservice接口来咯,欢迎各位小伙伴吐槽~本次拿免费的互联网国内手机号码归属地查询WEB服务webservice接口做例子,当然有很多免费webservice接口可以供大家使用 ...
- CPU 内存 硬盘的区别
第一点:CPU 是处理器,内存和硬盘是存储器,受CPU 的控制. 第二点:由于内存的速度很快,在电脑运行的过程中,CPU通常只与内存交换数据,但内存断电数据就会全部丢失,因此电脑使用硬盘作为主要的存 ...
- java通过反射获取bean字段注解@Column中的信息
直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- 我理解的ios和android
近期着手了几个android和ios的项目,如今说下我的几个对他们的理解 从设计上来讲.我觉得android 它更像是个网页,一个页面跳到另外一个页面,两者之间的关联不是非常大,仅仅能传递一些简单的參 ...