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是不允许文件字含:(冒号)的 所以需要抓包后 ...
随机推荐
- [原创]jQuery Validation范例
上班无事,学习jQuery Validation,于是手写一公共范例,并收藏以便后用 验证操作类formValidatorClass.js }); 测试页index.html * {} ...
- 转:vue-router 2.0 常用基础知识点之router.push()
转载地址:http://www.jianshu.com/p/ee7ff3d1d93d router.push(location) 除了使用 <router-link> 创建 a 标签来定义 ...
- 【OOB】MSHTML!CPasteCommand::ConvertBitmaptoPng heap-based buffer overflow学习
IE 11 MSHTML!CPasteCommand::ConvertBitmaptoPng heap-based buffer overflow学习 MS14-056, CVE-2014-41 ...
- vue后台管理框架
vue后台管理框架 系列教程<一步步带你做vue后台管理框架>第一课 github地址:vue-framework-wz 线上体验地址:立即体验 在如今的科技公司中有很多前端的需求都是要写 ...
- 【LOJ】#2090. 「ZJOI2016」旅行者
题解 每次按较长边把矩形分成两半,找一个中间轴,轴上的每个点跑一边最短路更新所有的答案 然后把矩形分成两半,递归下去 代码 #include <bits/stdc++.h> #define ...
- CSS------li中的宽和高无法修改问题
如图: 代码:(需要将display属性值设置为inline-block) <ul style="margin-top:50px"> <li style=&quo ...
- Android导入依赖appcompat-v7报错
Android导入依赖appcompat-v7报错 导入appcompat-v7时报错了 导入的是implementation 'com.android.support:appcompat-v7: ...
- 模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)
模拟POST.Get 请求的工具----APIpost(中文版POSTMAN) 快速生成.一键导出api文档 在线模拟调试,结果实时返回 模拟登录后请求API 支持团队协作 官网:https://ww ...
- 2019 A类
- Java变量的默认值和初始化
Java变量的默认值和初始化 学习自 <Thinking In Java> 技术小黑屋-为什么局部变量需要显式设置初始化值 变量的默认值 注意只有成员变量才有默认值,而局部变量必须要赋初值 ...