delphi编写sql脚本文件批量执行程序
程序使用DelphiXE11.1开发,用到控件UniDac9.1.1,QDAC里面的Qlog组件。
程序实现了SQL脚本文件批处理执行应用,运行效果图。

文件.pas代码
unit main; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, IOUtils, System.Generics.Collections,
System.Generics.Defaults,Winapi.ShellAPI,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
DBAccess, UniDacVcl,
OracleUniProvider, SQLServerUniProvider, Data.DB, Uni, Vcl.ComCtrls,
Vcl.ExtCtrls, Vcl.CheckLst, Vcl.StdCtrls, DAScript, UniScript, DASQLMonitor,
UniSQLMonitor,qlog, MemDS; type
TfrmMain = class(TForm)
con1: TUniConnection;
uncnctdlg1: TUniConnectDialog;
stat1: TStatusBar;
lst_script: TCheckListBox;
pnlTop: TPanel;
btn_Connect: TButton;
btn_Refresh: TButton;
mmo1: TMemo;
spl1: TSplitter;
btn_Exec: TButton;
unscrpt1: TUniScript;
unsqlmntr1: TUniSQLMonitor;
pgc1: TPageControl;
ts1: TTabSheet;
ts2: TTabSheet;
mmo2: TMemo;
ts3: TTabSheet;
mmo_note: TMemo;
btn_ViewLog: TButton;
unqry1: TUniQuery;
procedure btn_ConnectClick(Sender: TObject);
procedure btn_RefreshClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btn_ExecClick(Sender: TObject);
procedure unsqlmntr1SQL(Sender: TObject; Text: string; Flag: TDATraceFlag);
procedure unscrpt1Error(Sender: TObject; E: Exception; SQL: string;
var Action: TErrorAction);
procedure unscrpt1AfterExecute(Sender: TObject; SQL: string);
procedure unscrpt1BeforeExecute(Sender: TObject; var SQL: string;
var Omit: Boolean);
procedure btn_ViewLogClick(Sender: TObject);
private
sprInfo:string;
execOK: Boolean;
execDuration: Cardinal;
iTotalCount:Integer; //总共运行了多少次脚本
iErrCount:Integer; //总共运行了多少次脚本
procedure ExecOneScript(sqlFile: string);
{ Private declarations }
public
{ Public declarations }
end; var
frmMain: TfrmMain; implementation {$R *.dfm} procedure TfrmMain.FormShow(Sender: TObject);
begin
pgc1.ActivePageIndex := 0;
btn_Refresh.Click;
end; procedure TfrmMain.unscrpt1AfterExecute(Sender: TObject; SQL: string);
begin
// mmo2.Lines.Add('after------'execDuration.ToString);
if (iTotalCount>0) and execOK then
begin
execDuration := (GetTickCount - execDuration);
sprInfo:= '耗时:' + FloatToStr(execDuration/1000) + '秒,影响行数' + unqry1.RowsAffected.ToString;
PostLog(llMessage,sprInfo);
mmo2.Lines.Add(sprInfo);
end;
end; procedure TfrmMain.unscrpt1BeforeExecute(Sender: TObject; var SQL: string;
var Omit: Boolean);
begin
// mmo2.Lines.Add('before------'GetTickCount.ToString);
Inc(iTotalCount);
execDuration := GetTickCount;
end; procedure TfrmMain.unscrpt1Error(Sender: TObject; E: Exception; SQL: string;
var Action: TErrorAction);
begin
Action := eaContinue;
end; procedure TfrmMain.unsqlmntr1SQL(Sender: TObject; Text: string;
Flag: TDATraceFlag);
begin
case Flag of
tfQExecute:
begin
PostLog(llMessage,'SQL>:');
mmo2.Lines.Add('SQL>:');
execOK := True;
end;
tfError:
begin
Inc(iErrCount);
execOK := False;
end;
end;
PostLog(llMessage,Text);
mmo2.Lines.Add(Text);
end; // 连接到数据库
procedure TfrmMain.btn_ConnectClick(Sender: TObject);
begin
con1.ConnectDialog.Execute;
if con1.Connected then
stat1.Panels[0].Text := '数据库连接成功!';
end; // 执行脚本
procedure TfrmMain.btn_ExecClick(Sender: TObject);
var
i, iCount: integer;
sLogPath: string;
begin
//日志准备,创建日志输出,10M后自动压缩
sLogPath := ExtractFilePath(ParamStr(0))+'Logs\'; // 结尾有斜杠
SetDefaultLogFile(sLogPath + FormatDateTime('yyyymmdd_hhnnss',Now) +'execute.log', 10242880);
//开始执行
iCount := 0;
mmo2.Lines.Clear;
iCount := 0;
for i := 0 to lst_script.Items.Count - 1 do
begin
if lst_script.Checked[i] then
Inc(iCount);
end;
if iCount = 0 then
begin
Application.MessageBox('请选择要执行的脚本', '提示', MB_ICONSTOP);
Exit;
end;
if not con1.Connected then
begin
Application.MessageBox('请先连接数据库', '提示', MB_ICONSTOP);
Exit;
end;
i := Application.MessageBox(PWideChar('共选中【' + iCount.ToString + '】脚本个,确定执行吗?'), '提示', MB_YESNO);
if (i <> ID_YES) then
Exit;
// 逐个执行脚本
for i := 0 to lst_script.Items.Count - 1 do
begin
if lst_script.Checked[i] then
ExecOneScript(lst_script.Items[i]);
end;
mmo1.Text := '执行已完成.运行次数'+iTotalCount.ToString+',忽略错误次数'+iErrCount.ToString;
end; // 刷新脚本文件
procedure TfrmMain.btn_RefreshClick(Sender: TObject);
var
files: TArray<string>;
path: string;
str: string;
iChk: integer;
begin
path := ExtractFilePath(ParamStr(0));
files := TDirectory.GetFiles(path, '*.sql', TSearchOption.soAllDirectories);
TArray.Sort<string>(files);
lst_script.Items.BeginUpdate;
try
lst_script.Items.Clear;
for str in files do
lst_script.Items.Add(str);
finally
lst_script.Items.EndUpdate;
end;
lst_script.CheckAll(cbChecked, False, False);
end; //查看日志文件
procedure TfrmMain.btn_ViewLogClick(Sender: TObject);
var
sPath:string;
begin
sPath:=ExtractFilePath(ParamStr(0))+'Logs';
ShellExecute(Handle,'open','Explorer.exe',PChar(sPath),nil,1);
end; // 执行一个脚本文件
procedure TfrmMain.ExecOneScript(sqlFile: string);
var
i: integer;
sCaption:string;
begin
stat1.Panels[0].Text := sqlFile;
sCaption:='------------>>>>>>'+sqlFile;
mmo2.Lines.Add(sCaption);
PostLog(llMessage,sCaption);
unscrpt1.SQL.LoadFromFile(sqlFile, TEncoding.UTF8);
for i := 0 to unscrpt1.Statements.Count - 1 do
begin
mmo1.Text := unscrpt1.Statements[i].SQL;
Application.ProcessMessages;
unscrpt1.ExecuteNext;
end;
end; end.
From表单文件代码
object frmMain: TfrmMain
Left = 0
Top = 0
BorderStyle = bsSingle
Caption = 'SQL'#33050#26412#25191#34892#21161#25163'V1.0(20221212)'
ClientHeight = 730
ClientWidth = 1181
Color = clBtnFace
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = #24494#36719#38597#40657
Font.Style = []
Position = poScreenCenter
OnShow = FormShow
TextHeight = 20
object stat1: TStatusBar
Left = 0
Top = 703
Width = 1181
Height = 27
Panels = <
item
Width = 50
end>
ParentFont = True
UseSystemFont = False
end
object pnlTop: TPanel
Left = 0
Top = 0
Width = 1181
Height = 52
Align = alTop
BevelOuter = bvNone
TabOrder = 0
object btn_Connect: TButton
Left = 131
Top = 5
Width = 103
Height = 41
Caption = #36830#25509#25968#25454#24211
TabOrder = 1
OnClick = btn_ConnectClick
end
object btn_Refresh: TButton
Left = 12
Top = 5
Width = 109
Height = 41
Caption = #21047#26032#33050#26412#30446#24405
TabOrder = 0
OnClick = btn_RefreshClick
end
object btn_Exec: TButton
Left = 239
Top = 5
Width = 103
Height = 41
Caption = #24320#22987#25191#34892
TabOrder = 2
OnClick = btn_ExecClick
end
object btn_ViewLog: TButton
Left = 367
Top = 5
Width = 103
Height = 41
Caption = #26597#30475#26085#24535#25991#20214
TabOrder = 3
OnClick = btn_ViewLogClick
end
end
object pgc1: TPageControl
Left = 0
Top = 52
Width = 1181
Height = 651
ActivePage = ts1
Align = alClient
TabOrder = 2
object ts1: TTabSheet
Caption = #25191#34892#33050#26412
object spl1: TSplitter
Left = 0
Top = 413
Width = 1173
Height = 5
Cursor = crVSplit
Align = alBottom
ExplicitTop = 412
end
object lst_script: TCheckListBox
Left = 0
Top = 0
Width = 1173
Height = 413
Align = alClient
ItemHeight = 20
TabOrder = 0
end
object mmo1: TMemo
Left = 0
Top = 418
Width = 1173
Height = 198
Align = alBottom
ReadOnly = True
TabOrder = 1
end
end
object ts2: TTabSheet
Caption = #26085#24535#36755#20986
ImageIndex = 1
object mmo2: TMemo
Left = 0
Top = 0
Width = 1173
Height = 616
Align = alClient
ReadOnly = True
ScrollBars = ssBoth
TabOrder = 0
end
end
object ts3: TTabSheet
Caption = #20351#29992#35828#26126
ImageIndex = 2
object mmo_note: TMemo
Left = 0
Top = 0
Width = 1173
Height = 616
Align = alClient
Lines.Strings = (
'1'#12289'SQL'#33050#26412#38656#20026'UTF-8'#25991#20214#32534#30721#26684#24335#65292#23558#24453#25191#34892#33050#26412#25918#21040#31243#24207#21516#30446#24405#20013#65292#24182#25353#29031#25191#34892#39034#24207#21629#21517#12290
'2'#12289'create,declare'#31561#27492#31867#35821#21477#22359#20195#30721#27573','#26411#34892#38656#29992'/'#32467#26463#12290
'3'#12289#25191#34892#36807#31243#26377#26085#24535#36755#20986#65292#22914#26377#38169#35823#21457#29983#20250#34987#24573#30053#32487#32493#25191#34892#21518#38754#35821#21477#12290
'4'#12289#31243#24207#20026#21333#32447#31243#25191#34892#65292#25191#34892#32791#26102#38271#30340#33050#26412#20250#20986#29616#30028#38754#21345#30340#24773#20917#65292#31561#24453#33050#26412#25191#34892#32467#26463#12290
''
#38382#39064#21453#39304#65306'lybingyu@qq.com')
ReadOnly = True
ScrollBars = ssBoth
TabOrder = 0
end
end
end
object con1: TUniConnection
ProviderName = 'Oracle'
SpecificOptions.Strings = (
'Oracle.Direct=True')
Server = '127.0.0.1:1521:orcl'
ConnectDialog = uncnctdlg1
LoginPrompt = False
Left = 62
Top = 112
end
object uncnctdlg1: TUniConnectDialog
DatabaseLabel = #25968#25454#24211
PortLabel = #31471#21475
ProviderLabel = #25968#25454#24211#21378#21830
Caption = #36830#25509#21040#25968#25454#24211'...'
UsernameLabel = #29992#25143#21517
PasswordLabel = #23494#30721
ServerLabel = #26381#21153#22120
ConnectButton = #36830#25509
CancelButton = #21462#28040
LabelSet = lsCustom
Left = 155
Top = 143
end
object unscrpt1: TUniScript
BeforeExecute = unscrpt1BeforeExecute
AfterExecute = unscrpt1AfterExecute
OnError = unscrpt1Error
AutoCommit = True
Connection = con1
DataSet = unqry1
Left = 272
Top = 136
end
object unsqlmntr1: TUniSQLMonitor
OnSQL = unsqlmntr1SQL
Left = 444
Top = 173
end
object unqry1: TUniQuery
Connection = con1
Left = 340
Top = 259
end
end
delphi编写sql脚本文件批量执行程序的更多相关文章
- Delphi 7 在程序中直接执行SQL脚本文件
Delphi 7 在程序中直接执行SQL脚本文件 在处理MSDE一些操作中.需要执行一些SQL脚本.有的是从SQLServer 2000中生成的SQL为后缀的脚本.在MSDE中没有企业管理器,操作都是 ...
- PL/SQL批量执行SQL脚本文件
1.选择File > New > Command Windows(命令窗口) 2.输入 @ 符号,之后敲击回车键.从本地选择执行的 SQL脚本 等待批量命令全部执行成功,关闭页面即可 新增 ...
- MySQL控制台执行.sql脚本文件
用notepad++编写好一个.sql脚本文件: drop database if exists library; create database library default character ...
- SQL脚本文件执行器
处于项目需求,需要能够批量执行SQL脚本文件,需要由前台页面操作触发执行. 查找相关资料,发现 Ant 提供了 SQLExec 组件可以支持SQL文件的执行,测试效果不错. 以下是对 SQLExec ...
- 解决sql脚本文件太大无法打开的问题
as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...
- SQL数据库从高版本到低版本的迁移,同时解决sql脚本文件太大无法打开的尴尬问题
as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...
- SQL Server将数据导出到SQL脚本文件
http://www.studyofnet.com/news/list-8883.2-1-4.html 一.SQL Server 2008将数据导出到SQL脚本文件 1.打开SQL Server200 ...
- CUBRID学习笔记 28 执行sql脚本文件
一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...
- Java 执行 SQL 脚本文件
转自:http://blog.csdn.net/hongmin118/article/details/4588941 package com.unmi.db; import java.io.FileI ...
- 如何执行一个mysql的sql脚本文件
sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下:一.创建包含sql命 ...
随机推荐
- (Redis基础教程之十) 如何在Redis中运行事务
介绍 Redis是一个开源的内存中键值数据存储.Redis允许您计划一系列命令,然后一个接一个地运行它们,这一过程称为_transaction_.每个事务都被视为不间断且隔离的操作,以确保数据完整性. ...
- 版本管理客户端工具SourceTree
[使用] 1.设置SSH客户端 工具 > 选项 设置OpenSSH, SSH 密钥这一栏自然会去选择当前用户下的 .ssh 目录下的 id_rsa 这个私钥:
- element table 合并同类项并输出后台返回数据
table的样式如下 后台返回的数据格式是按照横着来的,因为表头是经过处理的,而且是作为独立出来的数据返给前端的,所以当我们进行数据填充的时候需要用到后台返回的完整的数据,要想一一对应的话,我们需要进 ...
- ZJSU五月多校合训
强度焦虑制造者 具体而言,zszz3在每个游戏版本中都会推出一名新角色,或加强一名旧角色.玩家必须将这名新角色或 被加强的旧角色编入队伍,否则就会落后于版本. 而编队数量是有限的,这意味着玩家可能不得 ...
- vue 适配不同分辨率显示问题
新建 js 文件 rem.js class DevicePixelRatio { constructor() { // this.flag = false; } // 获取系统类型 _getSyste ...
- fiddler:The system proxy was changed.Click to reenable capturing
前情 最近在开发一个老旧项目,由于本地环境已难跑起,于是想通过代理线上代码进行功能开发. 坑位 启动fiddler后,fiddler菜单栏会警告,大概意思是代理被更改了,点击重启fillder代理,但 ...
- git 报错 error: bad signature 0x00000000 fatal: index file corrupt
index file在 git 里面一般指的是 .git/index 这个文件.这个文件保存的是暂存区的信息(索引信息). 报错说明这个文件已经损坏了 直接删除这个文件,然后执行如下命令 git re ...
- js 吸顶以及一些获取文档高度等小方法
1.返回html文档元素document.documentElement 2.文档的高度document.body.clientHeight 3.html文档可视高度==页面可见区域的高度docume ...
- 使用 OpenXML 创建第一个 Word 文档
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; public class Op ...
- C# 7.0 新特性:模式匹配 ( pattern matching)
C# 7.0 新特性:模式匹配 ( pattern matching ) 在 C# 中,is 是一个关键字,可以用来检查某个数据的类型是否为特定类型.这是一个表达式,返回类型为 boolean. 例如 ...