中间件解析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下来, 改造一下测试用例 ...
随机推荐
- javascript面试题集
1.如何把一句英文每个单词第一个字母大写? var str = "what fuck is 1235 going on ?"; var newArr = str.split(&qu ...
- C# 相关概念
解决方案 在磁盘上由 .sln 文件表示,是一个或多个相关项目的容器. 例如,如果为 Python 应用程序编写 C++ 扩展,该 C++ 项目可以驻留在同一解决方案中. 解决方案还可以包含 Web ...
- Django基础之admin功能
Django默认开起了后台 1.访问admin后台 2.用户和密码进行登录 ============================================================== ...
- (转)淘淘商城系列——商品搜索功能Service实现
http://blog.csdn.net/column/details/15737.html 首先我们在taotao-search-interface工程中新建一个SearchService接口,并在 ...
- HDU_1505_矩阵中的最大矩形_dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1505 City Game Time Limit: 2000/1000 MS (Java/Others) ...
- 使用JS获取request参数
1.document.write('<%=request.getAttribute("param")%>'); 2.window.navigator.userAgent ...
- Java排序算法全
目录 Java排序算法代码 零. 排序基类 一. 选择排序 二. 插入排序 三. 希尔排序 四. 归并排序 1. 自顶向下 2. 自底向上 五. 快速排序 1. 基本版 2. 双路切分版 3. 三路切 ...
- 「 RQNOJ PID204 」 特种部队
解题思路 看了一下题解,感觉题解貌似有些错误.所以把我的见解放在这里,希望路过的大佬可以帮忙解释一下 QAQ 就是这里的更新 $dp[i-1][i]$ 和 $dp[i][i-1]$ 的时候,之前博主说 ...
- Luogu P3110 [USACO14DEC]驮运Piggy Back
解题思路 看到下面很多人都在说什么遇到了之后要不要背着走,其实根本不需要,同样的我也是跑了三遍$SPFA$,求出了以$1$为起点到个点的$dist$,和以$2$为起点到个点的$dist$,还有以$n$ ...
- win10 ubuntu 子系统安装php
apt-get install python-software-propertiesadd-apt-repository ppa:ondrej/phpapt-get updateapt-get ins ...