TStream实现多表提交
TStream实现多表提交
function TynFiredac.SaveDatas(const ATableName, ATableName2: string; ADeltas: TStream; AStorageFormat: string = 'binary'): string;
var
LStream1, LStream2: TStream;
begin
Result := 'false';
if (ATableName = '') or (ADeltas = nil) or (ATableName2 = '') then
Exit; LStream1 := TMemoryStream.Create;
LStream2 := TMemoryStream.Create;
TynStream.SplitStream(ADeltas, LStream1, LStream2);
LStream1.Position := 0;
LStream2.Position := 0;
try
try
if not FDConnection1.InTransaction then
FDConnection1.StartTransaction; // 开启事务
FDQuery1.Close; // 保存表一
FDQuery1.sql.Clear;
FDQuery1.CachedUpdates := True;
FDQuery1.UpdateOptions.UpdateTableName := ATableName;
FDQuery1.sql.Text := 'select * from ' + ATableName + ' where 1=2';
FDQuery1.LoadFromStream(LStream1, TynStream.GetFDStorageFormat(AStorageFormat));
if FDQuery1.ApplyUpdates = 0 then
begin
Result := 'true';
end
else
begin
Result := 'false';
FDConnection1.Rollback; // 回滚事务
Exit; // 保存表一发生错误,表二就不用再提交
end; FDQuery1.Close; // 保存表二
FDQuery1.sql.Clear;
FDQuery1.CachedUpdates := True;
FDQuery1.UpdateOptions.UpdateTableName := ATableName2;
FDQuery1.sql.Text := 'select * from ' + ATableName2 + ' where 1=2';
FDQuery1.LoadFromStream(LStream2, TynStream.GetFDStorageFormat(AStorageFormat));
if FDQuery1.ApplyUpdates = 0 then
begin
Result := 'true';
FDConnection1.Commit; // 提交事务
end
else
begin
Result := 'false';
FDConnection1.Rollback; // 回滚事务
end;
except
on E: Exception do
begin
Result := 'false';
FDConnection1.Rollback; // 回滚事务
Log.WriteLog('TynFiredac.SaveDatas ' + E.Message);
end;
end;
finally
LStream1.Free;
LStream2.Free;
FDQuery1.Close;
FDConnection1.Close;
end;
end;
TStream实现多表提交的更多相关文章
- firedac引擎DATASNAP多表查询和多表提交
firedac引擎DATASNAP多表查询和多表提交 属性设置FDTableAdapter1.SchemaAdapter := FDSchemaAdapter;FDTableAdapter1.DatS ...
- TStream实现多表查询
TStream实现多表查询 function TynFiredac.QuerySQLS(const ASQL, ASQL2: string; AStorageFormat: string = 'bin ...
- DATASNAP多表提交之事务控制之通用方法
ERP系统的单据,总是些主从表结构,有一个主表,N个子表,子表又有子表,形成N层,单据数据提交时,主从表数据都要提交,为了保证数据的完整性,必须提供事务控制,要么都提交成功,有一个提交失败所有的提交都 ...
- mysql锁表机制及相关优化
(该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...
- oracle 数据库备份、还原、和使用心得(表丢失、视图丢失的解决办法)
一.oracle数据备份:exp 关键字 说明(默认值) 关键字 说明(默认值) --------------------------------- ...
- pycharm 直接删掉数据表之后,makemigration和migrate 之后,数据库中依然没有生成数据表的问题
综合分析一下行程这个问题的原因: 在终端中运行 select * from django_migrations; 查看 提交的记录,如果你的表删掉了,记录还在,那么数据库会觉得,这个表依然是存在的,所 ...
- DATASNAP数据提交之FIREDAC的TFDJSONDeltas
DATASNAP数据提交之FIREDAC的TFDJSONDeltas FIREDAC的TFDJSONDeltas相当于CLIENTDATASET的DELTA,是作为CLIENTDATASET.DELT ...
- 在oracle存储过程中创建暂时表
在oracle的存储过程中,不能直接使用DDL语句,比方create.alter.drop.truncate等. 那假设我们想在存储过程中建立一张暂时表就仅仅能使用动态sql语句了: create o ...
- IIS6.0使用冒号上传漏洞利用
利用条件: 1.iis版本为6.0 2.上传文件名不会重命名 利用: 上传一个jpg木马图片 名字为:cs.asp:.jpg 注意是: 默认windows是不允许文件字含:(冒号)的 所以需要抓包后 ...
随机推荐
- numpy和pandas简单使用
numpy和pandas简单使用 import numpy as np import pandas as pd 一维数据分析 numpy中使用array, pandas中使用series numpy一 ...
- JavaEE之JavaWeb简介
- java 异常匹配
抛出异常的时候,异常处理系统会安装代码书写顺序找出"最近"的处理程序. 找到匹配的程序后,它就认为异常将得到清理,然后就不再继续查找. 查找的时候并不要求抛出的异常同处理程序的异常 ...
- SCU 4444: Travel(最短路)
Travel The country frog lives in has n towns which are conveniently numbered by 1,2,…,n . Among n(n− ...
- win10编译caffe跑faster-rcnn(cuda7.5)
2017年1月13日 15:46:04 github.com/Microsoft/caffe这版现在不算是BVLC/caffe的官方windows分支:官方windows分支是一个叫willyd的家伙 ...
- IDEA & Android Studio换主题背景
IDEA系列主题 http://www.riaway.com/index.phphttp://color-themes.com/?view=index 详细用法: https://www.jiansh ...
- IDEA中Ctrl+Shift+F快捷键无效的解决方式
某天突然发现idea非常重要的快捷键ctrl+shift+F无效了,网上搜了很多都说是qq快捷键冲突,但是找了下qq快捷键却没有解决,现在给大家一个解决快捷键冲突的思路: 1.查看QQ快捷键--> ...
- python3脚本获取本机公网ip
python脚本获取本机公网ip 1.获取公网IP地址方式,访问:http://txt.go.sohu.com/ip/soip 2.代码实现 import requests import re r ...
- 必读,sql加索引调优案例和explain extended说明
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 昨天分享了Mysql中的 explain 命令,使用 explain 来分析 select 语句的运行效果,如 :expl ...
- ApiPost自动化测试基础之:流程测试
我们在<ApiPost自动化测试基础之:接口参数依赖的情景处理>和<ApiPost自动化测试基础之:如何使用测试校验(测试用例)?>分别讲解了ApiPost自动化测试的基础知识 ...