程序使用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脚本文件批量执行程序的更多相关文章

  1. Delphi 7 在程序中直接执行SQL脚本文件

    Delphi 7 在程序中直接执行SQL脚本文件 在处理MSDE一些操作中.需要执行一些SQL脚本.有的是从SQLServer 2000中生成的SQL为后缀的脚本.在MSDE中没有企业管理器,操作都是 ...

  2. PL/SQL批量执行SQL脚本文件

    1.选择File > New > Command Windows(命令窗口) 2.输入 @ 符号,之后敲击回车键.从本地选择执行的 SQL脚本 等待批量命令全部执行成功,关闭页面即可 新增 ...

  3. MySQL控制台执行.sql脚本文件

    用notepad++编写好一个.sql脚本文件: drop database if exists library; create database library default character ...

  4. SQL脚本文件执行器

    处于项目需求,需要能够批量执行SQL脚本文件,需要由前台页面操作触发执行. 查找相关资料,发现 Ant 提供了 SQLExec 组件可以支持SQL文件的执行,测试效果不错. 以下是对 SQLExec ...

  5. 解决sql脚本文件太大无法打开的问题

    as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...

  6. SQL数据库从高版本到低版本的迁移,同时解决sql脚本文件太大无法打开的尴尬问题

    as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...

  7. SQL Server将数据导出到SQL脚本文件

    http://www.studyofnet.com/news/list-8883.2-1-4.html 一.SQL Server 2008将数据导出到SQL脚本文件 1.打开SQL Server200 ...

  8. CUBRID学习笔记 28 执行sql脚本文件

    一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...

  9. Java 执行 SQL 脚本文件

    转自:http://blog.csdn.net/hongmin118/article/details/4588941 package com.unmi.db; import java.io.FileI ...

  10. 如何执行一个mysql的sql脚本文件

    sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下:一.创建包含sql命 ...

随机推荐

  1. 命运的X

    命运的X cjx 生成函数强. 思路 首先,设 \(f_i\) 为添加第 \(i\) 项后满足条件的概率,\(g_i\) 任意添加至第 \(i\) 项的概率. 我们要求的答案: \[ans=\sum_ ...

  2. element ui table+分页 筛选全部数据

    1. @filter-change 要写在table根元素,也就是<el-table @filter-change="filterChange"></el-tab ...

  3. Windows远程登录到VirtualBox安装的Ubuntu11.10

    一.环境 本地:Windows xp 虚拟机:VirtualBox 虚拟机的操作系统:Linux-Ubuntu11.10 二.目的 在Windows下通过SecureCRT(putty也可)远程登录到 ...

  4. golang之性能分析工具pprof

    PProf 是一个 Go 程序性能分析工具,可以分析 CPU.内存等性能.Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入 runtime/ppro 或者 net/http/ ...

  5. Redis工具之redis_rdb_tools

    redis_rdb_tools工具的介绍: 解析redis的dump.rdb文件,分析内存,以JSON格式导出数据.|提供的功能有: 1. 生成内存报告 2. 转储文件到JSON 3. 使用标准的di ...

  6. c#之示波器功能

    c#上位机:示波器功能 好久没有更新了,因为最近主要学习了如何用c#去做一个示波器功能,这里的示波器主要是用于单片机的调试.下面,我主要分享一下我做示波器的一些心得: 我这里示波器是用winform做 ...

  7. ChatGPT在功能测试用例生成方面的优势

    功能测试是软件测试的非常重要的分类,所有软件系统都要保证功能的正确性,而测试用例则是功能测试的重中之重.测试用例的编写是测试人员必须认真面对的一件耗时费力.枯燥乏味的工作.如何才能快速高效地编写测试用 ...

  8. 【Amadeus原创】docker安装TOMCAT,并运行本地代码

    1,docker 下载tomcat [root@it-1c2d ~]# docker pull tomcat ... [root@it-1c2d ~]# docker images REPOSITOR ...

  9. shell 获取 目录名 当前目录名

    Four ways to extract the current directory name By  Sergio Gonzalez Duran on November 06, 2007 (9:00 ...

  10. 2024 Nuxt3 年度生态总结

    hello,大家好,我是程序员海军.很荣幸能与大家分享我今年的第三篇文章.在过去的一年里,我深入探索了Nuxt3,并在多个项目中实际应用了这一前沿框架,从而对其功能和应用有了全面而深刻的理解.今天,我 ...