中间件解析FDMEMTABLE.delta生成SQL的方法
遍历Delta.DataView.Rows,Delta.DataView.Rows是记录的行集,由行组成
TFDDatSRow,即是一行记录的对象
TFDDatSRow的方法:
{
引用 System.JSON;
函数名称:DBToJSON(TFDMemTable 数据转成SQL脚本更新)
参数:
DB:TFDMemTable数据集
sTable:更新表名
sKey:关键字段,写法:ID,Name 以逗号区分
sNoField:不需要修改或增加的字段: 写法:ID,Sex 以逗号区分
}
function DBToJSON(DB:TFDMemTable;sTable:string;sKey:String;sNoField:String):String;
Var
ItemKey,ItemNoField:TStringlist;
JA:TJSONArray;
sField,sValue,sSQL,sTmp,sName:string;
i,j:Integer;
begin
JA:=TJSONArray.Create;
ItemKey:=TStringlist.Create;
ItemNoField:=TStringlist.Create;
ItemKey.Delimiter:=',';
ItemKey.DelimitedText:=sKey;
ItemNoField.Delimiter:=',';
ItemNoField.DelimitedText:=sNoField;
sField:='';
sValue:='';
sSQL:='';
with DB.Delta.DataView.Rows do begin
for I := 0 to Count-1 do begin
//判断数据的操作状态 :插入
if ItemsI[i].RowState=TFDDatSRowState.rsInserted then begin
//循环对应的数据字段
for j := 0 to DB.Fields.Count-1 do begin
//获取字段名称
sName:=DB.Fields[J].FieldName;
//排除不需要插入的字段信息
if ItemNoField.IndexOf(sName)>-1 then
Continue;
//判断字段的数据类型
case DB.Fields[J].DataType of
ftString,ftWideString,ftMemo: sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
ftSmallint, ftInteger,ftFloat, ftCurrency, ftBCD: sTmp:=VarToStr(ItemsI[i].GetValues(sName));
ftDateTime: begin
sTmp:=VarToStr(ItemsI[i].GetValues(sName));
//日期如何没有填写默认为Null
if sTmp='' then
sTmp:='Null'
else
sTmp:=FormatDateTime('yyyy-mm-dd hh:ss:mm',StrToDateTime(sTmp)).QuotedString;
end;
ftBoolean: begin
if ItemsI[i].GetValues(sName)=True then
sTmp:='1'
else
sTmp:='0';
end;
else
sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
end;
//累积字段和插入值
sField:=sField+sName+',';
sValue:=sValue+sTmp+',';
end;
//拼接成SQL并插入到数组中
JA.Add('Insert Into '+sTable+' ('+Copy(sField,1,Length(sField)-1)+')'+#13#10
+' Values('+Copy(sValue,1,Length(sValue)-1)+')'+#13#10 ) ;
end
//判断数据的操作状态 :修改
else if ItemsI[i].RowState in [TFDDatSRowState.rsModified,
TFDDatSRowState.rsEditing] then begin
for j := 0 to DB.Fields.Count-1 do begin
sName:=DB.Fields[J].FieldName;
//排除不需要插入的字段信息
if ItemNoField.IndexOf(sName)>-1 then
Continue;
//判断字段的数据类型
case DB.Fields[J].DataType of
ftString,ftWideString,ftMemo: sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
ftSmallint, ftInteger,ftFloat, ftCurrency, ftBCD: sTmp:=VarToStr(ItemsI[i].GetValues(sName));
ftDateTime: begin
sTmp:=VarToStr(ItemsI[i].GetValues(sName));
if sTmp='' then
sTmp:='Null'
else
sTmp:=FormatDateTime('yyyy-mm-dd hh:ss:mm',StrToDateTime(sTmp)).QuotedString;
end;
ftBoolean: begin
if ItemsI[i].GetValues(sName)=True then
sTmp:='1'
else
sTmp:='0';
end;
else
sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
end;
//累积更新字段值
sField:=sField+sName+'='+sTmp+',';
//修改数据关键字段,条件值
if ItemKey.IndexOf(sName)>-1 then
sSQL:=sSQL+' And '+ sName+' = '+VarToStr(ItemsI[i].GetData(sName,rvOriginal));
end;
//拼接成SQL并插入到数组中
JA.Add('Update '+sTable+' Set '+Copy(sField,1,Length(sField)-1)+' Where '+Copy(sSQL,5,Length(sSQL)) );
end
else if ItemsI[i].RowState in [TFDDatSRowState.rsDeleted] then begin
sSQL:='';
//删除数据关键字段,条件值
for J := 0 to ItemKey.Count-1 do begin
sValue:=ItemsI[i].GetValues(ItemKey.Strings[j]);
if sValue.Trim<>'' then
sSQL:=sSQL+' And '+ ItemKey.Strings[j]+' = '+QuotedStr(sValue.Trim);
end;
//拼接成SQL并插入到数组中
if sSQL<>'' then
JA.Add('Delete '+sTable+' Where '+Copy(sSQL,5,Length(sSQL)) );
end;
end;
end;
Result:=JA.ToString;
FreeAndNil(JA);
FreeAndNil(ItemKey);
FreeAndNil(ItemNoField);
end;
中间件解析FDMEMTABLE.delta生成SQL的方法的更多相关文章
- 监视EF生成SQL的方法(log , SqlServerProfile)
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...
- FDMemTable.Delta 转SQL语句脚本
{*******************************************************} { } { XE7.XE8.XE10 安卓 IOS 框架 } { } { 版权所有 ...
- PowerDesigner生成sql及HTML格式数据库文档
一.PowerDesigner生成sql问题 生成sql的方法是 Database -->Generate Database (Ctrl + G ) 但是提示 Could not load VB ...
- 模拟Hibernate动态生成SQL语句
这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 <?xml version="1.0" encoding="utf-8& ...
- 批量生成sql语句,难得
在工作我们常常要批量生成sql文件,因为业务部门经常给我们的是excel文件,根据我的经验,推荐两种批量生成sql文件方式 1.excel批量生成sql ,sql语句如下 INSERT INTO Ta ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法
CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...
- 两种查看EFCore生成Sql语句的方法
一.利用反射生成查询语句 该方法转载自:https://jhrs.com/2019/28488.html (略有修改) using Microsoft.EntityFrameworkCore.Quer ...
- 使用mybatis的动态sql解析能力生成sql
需求: 计算平台,有很多表,打算提供一个基于sql的服务接口, sql不能完全在配置页面写死, 要能根据参数不同执行不同的语义,防止sql个数爆炸 把mybatis原码down下来, 改造一下测试用例 ...
随机推荐
- xcode 制作静态库文件(.a)
参考: http://www.jb51.net/article/37853.htm 摘要: 1. 获取.a文件的信息 lipo -info /Users/pjk1129/De ...
- 关于mybatis的xml文件中使用 >= 或者 <= 号报错的解决方案
当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...
- 第3章 DOM
1.节点,dom有3种节点,元素节点,文本节点,属性节点 2.元素节点是dom的原子,所有的属性节点和文本节点都被元素包含,但并不是所有的元素都包含他们 3.继承,节点树上的元素将继承父元素的样式和属 ...
- (求助)对某一颜色,设置透明度 alpha 后,其他使用该颜色的地方 受到影响!!!!原因未知
对某一颜色,设置透明度 alpha 后,其他使用该颜色的地方 受到影响!!!!原因未知,有谁碰到过这样的问题?????? 测试了以下三款手机,结果如下: 1.android 4.4.2: 不受影响 2 ...
- Python3.4的Pillow库实现验证码图片
转自 http://blog.csdn.net/bin381/article/details/41969493 from PIL import Image,ImageDraw, ImageFont, ...
- Java 基础入门随笔(4) JavaSE版——程序流程控制
上一节对于运算符有了大致的了解,这一节针对程序流程控制进行复习!程序流程控制包括顺序结构.判断结构(if).选择结构(switch).循环结构. 1.判断结构 ①if语句的第一种格式: ...
- 【sqli-labs】 less61 GET -Challenge -Double Query -5 queries allowed -Variation4 (GET型 挑战 双查询 只允许5次查询 变化4)
http://192.168.136.128/sqli-labs-master/Less-61/?id=1' 单引号双括号闭合 192.168.136.128/sqli-labs-master/Les ...
- 视频剪辑生成gif格式(php外挂python程序)完美!
接到朋友的需求,朋友是做php的,让我帮忙处理php生成gif的需求.他的项目类似抖音短视频那种,就是展示出来的界面是gif动图,然后点进去是完整的视频. 我想了想,我倒是没做过php生成gif的需求 ...
- UVA - 1618 Weak Key(RMQ算法)
题目: 给出k个互不相同的证书组成的序列Ni,判断是否存在4个证书Np.Nq.Nr.Ns(1≤p<q<r<s≤k)使得Nq>Ns>Np>Nr或者Nq<Ns&l ...
- MySQL各种版本的下载方式
1.在百度上搜“MySQL”,进入官网 原文地址:https://blog.csdn.net/mieleizhi0522/article/details/79109195