一、{逐条插入}
procedure TForm1.Button1Click(Sender: TObject);
const
strInsert = 'INSERT INTO MyTable(Name, Age) VALUES(:name, :age)';
begin
// FDQuery1.FetchOptions.AutoClose := True; //默认值
FDQuery1.ExecSQL(strInsert, ['A', 1]);
FDQuery1.ExecSQL(strInsert, ['B', 2]);
FDQuery1.ExecSQL(strInsert, ['C', 3]);
FDQuery1.ExecSQL(strInsert, ['D', 4]); FDQuery1.Open('SELECT * FROM MyTable');
end;
二、{一次行插入}
procedure TForm1.Button2Click(Sender: TObject);
const
strInsert = 'INSERT INTO MyTable(Name, Age) VALUES("%s", %d)';
var
LStr: string;
begin
LStr := '';
LStr := LStr + Format(strInsert, ['AA', 11]) + ';';
LStr := LStr + Format(strInsert, ['BB', 22]) + ';';
LStr := LStr + Format(strInsert, ['CC', 33]) + ';';
LStr := LStr + Format(strInsert, ['DD', 44]) + ';';
LStr := LStr + 'SELECT * FROM MyTable'; FDQuery1.ExecSQL(LStr);
FDQuery1.Open();
end;

三、{使用 NextRecordSet 方法提取并执行所有命令}
procedure TForm1.Button3Click(Sender: TObject);
const
strInsert = 'INSERT INTO MyTable(Name, Age) VALUES("%s", %d);';
begin
FDQuery1.FetchOptions.AutoClose := False; //按说这个是必须要设置的, 但测试时不设置也可以
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add(Format(strInsert, ['AAA', 111]));
FDQuery1.SQL.Add(Format(strInsert, ['BBB', 222]));
FDQuery1.SQL.Add(Format(strInsert, ['CCC', 333]));
FDQuery1.SQL.Add(Format(strInsert, ['DDD', 444])); FDQuery1.SQL.Add('SELECT * FROM MyTable'); FDQuery1.Execute();
FDQuery1.NextRecordSet;
end;

四、{使用 DML 数组参数}
procedure TForm1.Button4Click(Sender: TObject);
const
strInsert = 'INSERT INTO MyTable(Name, Age) VALUES(:name, :age);';
begin
FDQuery1.FetchOptions.AutoClose := False; // FDQuery1.SQL.Text := strInsert;
FDQuery1.Params.ArraySize := 4; //准备把上面的语句执行 4 次 {分别设置 4 次的参数}
FDQuery1.Params[0].AsStrings[0] := 'AAAA';
FDQuery1.Params[1].AsIntegers[0] := 1111; FDQuery1.Params[0].AsStrings[1] := 'BBBB';
FDQuery1.Params[1].AsIntegers[1] := 2222; FDQuery1.Params[0].AsStrings[2] := 'CCCC';
FDQuery1.Params[1].AsIntegers[2] := 3333; FDQuery1.Params[0].AsStrings[3] := 'DDDD';
FDQuery1.Params[1].AsIntegers[3] := 4444; FDQuery1.Execute(4, 0); //从 1 条开始执行 4 次 FDQuery1.SQL.Add('SELECT * FROM MyTable');
FDQuery1.NextRecordSet;
end;

五、{使用 FireDAC 扩展的 SQL Script(TFDScript), 它还能直接调用文件中的 SQL 指令}

CREATE TABLE BOOKS(ID INTEGER PRIMARY KEY, NAME TEXT);
INSERT INTO BOOKS(ID, NAME) VALUES(1, 'Delphi 2009 handbook');
INSERT INTO BOOKS(ID, NAME) VALUES(2, 'Delphi XE2入門');
INSERT INTO BOOKS(ID, NAME) VALUES(3, 'Delph');
执行文件中描述的SQL FDScript1.ExecuteFile('C:\data\sample.sql');
使用脚本参数
TFDScript的ExecuteFile方法将脚本参数作为第二个参数。
脚本参数是一个字符串数组。 FDScript1.ExecuteFile(文件名,脚本参数);
SQL语句中的“&职位编号”被替换为参数。 例子
C:\数据\ sample.sql CREATE TABLE &1(ID INTEGER PRIMARY KEY, NAME TEXT);
INSERT INTO &1(ID, NAME) VALUES(1, '&2');
INSERT INTO &1(ID, NAME) VALUES(2, '&3');
INSERT INTO &1(ID, NAME) VALUES(3, '&4');
执行文件中描述的SQL FDScript1.ExecuteFile('C:\data\sample.sql',
[ 'BOOKS',
'Delphi 2009 handbook―Delphi最新',
'Delphi XE2入門',
'Delphi']);
捕捉错误
如果执行SQL脚本时发生错误,则会引发OnError事件。 procedure TForm1.FDScript1Error(ASender: TObject;
const AInitiator: IFDStanObject; var AException: Exception);
begin ShowMessage(AException.Message);
end;
获取发生的错误数
您可以获取TotalErrors属性中发生的错误数。 FDConnection1.StartTransaction;
try
FDScript1.ExecuteFile('C:\data\sample.sql');
finally
if FDScript1.TotalErrors > 0 then
FDConnection1.Rollback
else
FDConnection1.Commit;
end
;
显示SQL脚本执行的进度
使用TFDGUIxScriptDialog显示SQL脚本执行的进度。 TFDGUIxScriptDialog 将TFDGUIxScriptDialog组件放置在窗体上,并设置TFDScript组件的ScriptDialog属性。 FDScript1.ScriptDialog := FDGUIxScriptDialog1;

{For example, to execute a script file, use the following code snippet: }

with FDScript1 do begin
SQLScriptFileName := 'c:\create.sql';
ValidateAll;
ExecuteAll;
end;
{To execute a script in a memory, use the following: }

with FDScript1 do begin
SQLScripts.Clear;
SQLScripts.Add;
with SQLScripts[0].SQL do begin
Add('INSERT INTO Brands VALUES (1, ''Audi'')');
Add('INSERT INTO Brands VALUES (2, ''BMW'')');
end;
ValidateAll;
ExecuteAll;
end;
{Also, there are some other methods that simplify the SQL script execution. You can control many other script execution aspects as from a Delphi code by using ScriptOptions as using corresponding script control commands. 

The script can also call other scripts, such as a subroutine, through the @ <script>, @@ <script>, START <script>, or INPUT <script> commands. 
In that case, <script> is either the item name from the SQLScripts collection, or the external file name.
For example, the 'root' script executes the 'first' and 'second' subscripts: } with FDScript1.SQLScripts do begin
Clear;
with Add do begin
Name := 'root';
SQL.Add('@first'); // explicitly call 'first' script
SQL.Add('@second'); // explicitly call 'second' script
end;
with Add do begin
Name := 'first';
SQL.Add('create table t1 (...);');
SQL.Add('create table t2 (...);');
end;
with Add do begin
Name := 'second';
SQL.Add('create procedure p1 (...);');
SQL.Add('create procedure p2 (...);');
end;
end;
FDScript1.ValidateAll;
FDScript1.ExecuteAll;
{
A SQL script can be executed as in full with a subscripts, using ExecuteAll method,
as in step-by-step mode using the ExecuteStep method.
The last method is useful for the GUI applications, allowing executing adhoc queries.
The next command will be extracted and executed from the Position position in the script. To abort the script execution, call the AbortJob method.
}

SQL脚本是一组独立的SQL、执行控制和日志命令。SQL脚本对于后端维护任务非常有用,比如后端SQL对象的创建、删除、升级、初始数据加载等等。

许多dbms允许在一个TFDQuery中执行多个SQL命令。ExecSQL调用作为一个批处理,但有限制。这些是SQL脚本和SQL命令批处理之间的区别:

该脚本允许在一个脚本中使用所有可能的SQL命令。批处理可能有限制,这取决于DBMS。例如,Oracle匿名PL/SQL块不能包含DDL命令。

该脚本可以划分为多个事务。批处理必须在单个事务中执行。

该脚本允许使用非sql和自定义命令。批处理只包括DBMS可以理解的命令。

脚本可以分为下标。批处理可以将存储过程作为分离的代码块调用。

脚本执行完全由客户机控制。批处理执行仅由DBMS控制。

与批处理执行不同,脚本执行可以被记录。

与批处理执行不同,脚本提供执行进度反馈。

与标准实用程序相比,TFDScript有许多优点,比如能够完全集成到FireDAC应用程序中,并通过自定义脚本命令扩展命令集。TFDScript组件知道一些行业标准的SQL脚本语法,包括:

Oracle SQL*Plus;
Microsoft ISQL/OSQL;
MySQL mysql.exe/mysqldump.exe;
Firebird/InterBase ISQL.



感谢参考 https://www.cnblogs.com/del/p/3758082.html
 
 
 

FireDAC 下的批量 SQL 命令执行的更多相关文章

  1. shell命令执行hive脚本(hive交互,hive的shell编程)

    Hive执行方式 Hive的hql命令执行方式有三种: 1.CLI 方式直接执行 2.作为字符串通过shell调用hive –e执行(-S开启静默,去掉"OK","Tim ...

  2. Jedis cluster命令执行流程剖析

    Jedis cluster命令执行流程剖析 在Redis Cluster集群模式下,由于key分布在各个节点上,会造成无法直接实现mget.sInter等功能.因此,无论我们使用什么客户端来操作Red ...

  3. 学习 Linux,101: 使用基本 SQL 命令

    概述 在本教程中,将学习结构化查询语言 (SQL),包括: 使用基本 SQL 命令 执行基本数据操作 本教程将简要介绍您需要知道的与 LPI 102 考试相关的 SQL 概念.   回页首 数据库和 ...

  4. 使用基本 SQL 命令

    概述 在本教程中,将学习结构化查询语言 (SQL),包括: 使用基本 SQL 命令 执行基本数据操做 数据库和 SQL 在本系列教程中,目前我们使用平面文本文件来存储数据.平面文本文件可能适合相对较少 ...

  5. ThinkPHP 5.0.x、5.1.x、5.2.x 全版本远程命令执行漏洞

    ThinkPHP 5.0.x.5.1.x.5.2.x 全版本远程代码执行漏洞 作者:SoulCat. 来源:CSDN 原文:https://blog.csdn.net/csacs/article/de ...

  6. 【bat批处理】批量执行某个文件夹下的所有sql文件bat批处理

    遍历文件夹下所有的sql文件,然后命令行执行 for /r "D:\yonyou\UBFV60\U9.VOB.Product.Other" %%a in (*.sql) do ( ...

  7. mysql 批处理命令执行多个sql脚本

    方法1 若有SQL脚本a.sql, b.sql, 其目录在f盘根目录下, 则可再写一个SQL脚本c.sql(假设其目录也在f盘根目录下, 也可以在其他路径下)如下: source f:/a.sql; ...

  8. MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

    最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...

  9. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  10. 游标遍历所有数据库循环执行修改数据库的sql命令

    MSSQL数据库服务器上有很多类似的数据库,需要将这些数据库统一修改其中的某些表或者某些命令,那么就会想到用游标来遍历. 先来说思路: 1,首先需要查询出所有的数据库: select [name] f ...

随机推荐

  1. x86平台SIMD编程入门(2):通用指令

    1.重解释转换 虽然128位的XMM寄存器在硬件上只是256位YMM寄存器的下半部分,但在C++中它们是不同的类型.有一些intrinsic函数可以将它们重新解释为不同的类型,如下表所示,行代表源类型 ...

  2. 分布式事务-XA-DTP-TCC-BASE介绍

    前言 数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 事务拥有以下四个特性,习惯上被称为 ACID 特性: 原子性(Atomici ...

  3. 阿里云-数据库-表格存储Tablestore

    入门篇一 初步调研了解 Step.1 场景锲合度判断选择使用表格存储前关键需要明确你的场景是否适合.表格存储是阿里云自2010起自研使用的一个多模型NoSQL数据库,面向海量大数据存储,身经百战.非常 ...

  4. FLink18--全窗口聚合方式2 ProcessWindowApp

    一.依赖 二.代码 package net.xdclass.class11; import java.util.List; import java.util.stream.Collectors; im ...

  5. maven项目中解决 .git文件太大问题

    一.git项目上传后项目文件太大,git filter-branch手动清理 最近发现一个项目git目录已经达到200MB,严重影响了clone代码.操作之前请全量备份代码,操作失误可恢复 二.测试项 ...

  6. Git指南-从入门到精通

    代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致 第一步: 文件增删改,变为已修改状态 第二步: git add ,变为已暂存状态 $ git status $ git add --a ...

  7. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)

    1.简介 通过前边两篇的学习,想必大家已经对iframe有了一定的认识和了解,是不是感觉和Python语言中的差不了多少,大同小异,最多就是不同开发语言的一些语法差异.今天这一篇主要是对iframe做 ...

  8. IPTools for .NET:快速查询全球IP信息

    IPTools 是一个用于快速查询全球 IP 地址信息的库,支持国内和国际 IP 查询,提供详细的地理位置信息(如国家.省份.城市)以及经纬度等数据. 1. IPTools.China IPTools ...

  9. 查看 OceanBase 执行计划

    使用benchmarksql压测数据库,产生高消耗的sql并测试数据库性能 压测环境部署 benchmarksql下载 git clone https://github.com/meiq4096/be ...

  10. [WC2014] 紫荆花之恋 题解

    啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊. 因为没有在最开始的时候将所有点设置为已经重构的,所以直接 \(R15-R70\) 间卡了两三天. 似乎也是我第一次大规模使用指针了. 这道题假如只有 ...