`
wangminshe89
  • 浏览: 693292 次
文章分类
社区版块
存档分类
最新评论

Inno Setup执行SQL脚本的方法

 
阅读更多

作为和NSIS并立的、两个最流行的免费Windows应用程序安装包制作工具之一,Inno在学习难度上相对要低一些,非常适合对一些简单的桌面程序打包。但对于较复杂的安装过程,或者Web应用程序来说,我个人觉得不是Inno的强项。当然,既然Inno内嵌了Pascal语言用以扩展功能,理论上不是不可以应付复杂的安装过程,但实现起来要复杂一些。

比如对于在安装过程中连接数据库并执行SQL脚本这样的需求,使用InstallShield应该会简单地多,而Inno却不支持直接操作数据库,并且相关的资料说明少之又少,还不如NSIS丰富,以至于我踏破铁鞋无觅处,最终却在NSIS的资料中找到了思路。

主要的思路是,在安装过程中,调用数据库客户端连接数据库并执行SQL脚本,然后将执行结果或错误信息输出到文件中,最后通过分析这个文件来判断命令执行的结果。但是,既然是调用特定的客户端,那么对不同数据库的操作自然就有所区别,具体情况如下所述。

首先在打包脚本的[Files]段将必需的文件包含进来:

[Files]
Source: "D:/Development/MyDemoApp/code/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

;osql.exe在SQL Server2000安装目录中
Source: "D:/Development/MyDemoApp/osql.exe"; Flags: dontcopy
Source: "D:/Development/MyDemoApp/mysql.exe"; Flags: dontcopy
Source: "D:/Development/MyDemoApp/script_mssql.sql"; Flags: dontcopy
Source: "D:/Development/MyDemoApp/script_mysql.sql"; Flags: dontcopy
Source: "D:/Development/MyDemoApp/script_oracle.sql"; Flags: dontcopy

在SQL Server中执行脚本的代码片断:

function ExecScriptInMSSQL(DBHost, DBLogin, DBPass, DBName: String): Boolean;
var
ConnectExe: String;
ConnectParam: String;
begin
{解压临时文件}
ExtractTemporaryFile('osql.exe');
ExtractTemporaryFile('script_mssql.sql');
{构造数据库连接字符串}
ConnectExe := ExpandConstant('{tmp}') + '/osql.exe';
ConnectParam := ' -S ' + DBHost
+ ' -U ' + DBLogin
+ ' -P ' + DBPass
+ ' -d ' + DBName
+ ' -i script_mssql.sql -o '
+ ExpandConstant('{tmp}') + '/dbstatus.txt';
{建立数据库连接并执行脚本}
if Exec(ConnectExe, ConnectParam, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin
Result := ResultCode = 0;
LoadStringFromFile(ExpandConstant('{tmp}') + '/dbstatus.txt', StatusString);
if StatusString <> '' then begin
MsgBox(StatusString, mbError, MB_OK);
Result := False;
end else begin
Result := True;
end;
end else begin
MsgBox('Database update failed:'#10#10 + SysErrorMessage(ResultCode), mbError, MB_OK);
Result := False;
end;
end;

在MySQL中执行脚本的代码片断:

function ExecScriptInMYSQL(DBHost, DBLogin, DBPass, DBName: String): Boolean;
var
ConnectExe: String;
ConnectParam: String;
begin
{解压临时文件}
ExtractTemporaryFile('mysql.exe');
ExtractTemporaryFile('script_mysql.sql');
{构造数据库连接字符串}
ConnectExe := ExpandConstant('cmd');
ConnectParam := ' /c "' + ExpandConstant('{tmp}') + '/mysql.exe'
+ ' -h' + DBHost
+ ' -u' + DBLogin
+ ' -p' + DBPass
+ ' -D' + DBName
+ ' -e "source ' + ExpandConstant('{tmp}') + '/script_mysql.sql""> ' + ExpandConstant('{tmp}') + '/dbstatus.txt 2>&1';
{建立数据库连接并执行脚本}
if Exec(ConnectExe, ConnectParam, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin
Result := ResultCode = 0;
LoadStringFromFile(ExpandConstant('{tmp}') + '/dbstatus.txt', StatusString);
if StatusString <> '' then begin
MsgBox(StatusString, mbError, MB_OK);
Result := False;
end else begin
Result := True;
end;
end else begin
MsgBox('Database update failed:'#10#10 + SysErrorMessage(ResultCode), mbError, MB_OK);
Result := False;
end;
end;

由于mysql.exe没有输出结果到文件的参数,故需要使用cmd.exe来运行mysql.exe以便将其输出重定向到文件dbstatus.txt中。此外,在命令的最后加上参数2>&1,将标准错误输出设备也重定向到文件上,否则命令执行的错误信息不会输出到文件中。

在Oracle中执行脚本的代码片断:
function ExecScriptInORACLE(ClientPath, DBInstance, DBLogin, DBPass: String): Boolean;
begin
{解压临时文件}
ExtractTemporaryFile('script_oracle.sql');
{连接数据库并执行脚本}
if Exec(ExpandConstant('cmd'), ' /c "' + ClientPath + ' -L -S ' + DBLogin
+ '/' + DBPass
+ '@' + DBInstance
+ ' @' + ExpandConstant('{tmp}') + '/script_oracle.sql> ' + ExpandConstant('{tmp}') + '/dbstatus.txt 2>&1',
'',
SW_HIDE, ewWaitUntilTerminated, ResultCode)
then begin
Result := ResultCode = 0;
LoadStringFromFile(ExpandConstant('{tmp}') + '/dbstatus.txt', StatusString);
if Pos('holytail', StatusString) <> 0 then begin
{若输出信息中有“holytail”的子串,则表示脚本成功执行}
{若执行有误,提示用户打开日志文件}
if Pos('ORA-', StatusString) <> 0 then begin
{提示用户脚本执行出错}
if MsgBox('数据库更新出错,是否打开日志文件?', mbConfirmation, MB_YESNO) = IDYES then begin
{打开日志}
if not ShellExec('', ExpandConstant('{tmp}') + '/dbstatus.txt', '', '', SW_SHOW, ewNoWait, ErrorCode) then begin
MsgBox('日志文件打开错误!', mbError, MB_OK);
end;
end;
Result := False;
{若执行无误,返回True}
end else begin
Result := True;
end;
end else if StatusString <> '' then begin
MsgBox(StatusString, mbError, MB_OK);
Result := False;
end else begin
Result := True;
end;
end else begin
MsgBox('Database update failed:'#10#10 + SysErrorMessage(ResultCode), mbError, MB_OK);
Result := False;
end;
end;
Oracle的客户端太大,不能集成到安装包中,应使用一个TInputFileWizardPage由用户选择sqlplus.exe的安装位置。同时,由于sqlplus.exe也没有输出结果到文件的参数,也须使用cmd.exe来运行它并重定向输出到文件。此外,由于sqlplus.exe执行脚本时无论成功还是失败,都会输出信息,故无法像使用sqlcmd.exe和mysql.exe那样简单地判断脚本是否执行成功,需要在脚本的最后通过select语句输出一个特殊的字符串到文件中,然后通过判断dbstatus.txt中是否存在该字符串来判断脚本的执行情况;且由于sqlplus.exe执行完脚本后不会自动退出,还要在脚本最后加上exit语句;故script_oracle.sql的最后必须是如下内容:

SELECT 'holytail' FROM dual;
exit;

分享到:
评论

相关推荐

    Inno Setup执行SQL脚本的方法.zip_inno setup_执行sql_脚本

    比如对于在安装过程中连接数据库并执行SQL脚本这样的需求,使用InstallShield应该会简单地多,而Inno却不支持直接操作数据库,并且相关的资料说明少之又少,还不如NSIS丰富,以至于我踏破铁鞋无觅处,最终却在NSIS的...

    innosetup 内含英文资源

    10. **丰富的组件和插件**:社区提供了许多第三方组件和插件,可以进一步扩展InnoSetup的功能,例如添加对.NET Framework、SQL Server等的检测和安装。 综上所述,InnoSetup是制作专业级Windows安装程序的理想选择...

    delphi所有笔记,还有mongodb innosetup sql等

    Innosetup的笔记会涉及创建安装脚本、设置安装路径、添加文件、处理注册表项和创建快捷方式等。InnoSetup允许自定义安装过程,包括许可协议、安装类型选择和自定义安装目录。这对于为Delphi开发的应用程序提供用户...

    .NET Framework 1.1-2.0-3.5 Installer for InnoSetup

    综上所述,这个压缩包提供了一种方法来集成.NET Framework的早期版本到InnoSetup安装程序中,确保用户能够在没有这些框架的情况下顺利安装和运行依赖它们的应用程序。这对于那些需要向仍使用旧版操作系统的用户提供...

    Inoo Setup打包.net Winform程序源代码

    【Inno Setup打包.NET Winform程序源代码】用于创建Windows桌面应用的安装程序,特别是针对.NET Framework 2.0和SQL Server的环境检查。这篇文章主要介绍如何使用Inno Setup工具来构建一个具备自动检测和安装.NET ...

    inno脚本实例、安装包和插件.rar

    如何测试一个SQL Server ODBC驱动程序连接使用的是5。如何检测是否和哪个版本的MS ...Inno Setup可视化编辑。如何创建的ODBC DSN 2。如何检测IE浏览器安装的版本。如何检测安装的MDAC版本。如何检测安装的ADSI版本。

    CSharp-SQL.rar_C#打包_C#项目发布_c#sql开发_c#安装数据库_csharp开发项目

    - 如何编写SQL脚本来创建和初始化数据库。 - 如何在C#代码中调用这些脚本,确保在应用程序启动时自动执行。 - 如何配置项目设置,将数据库文件打包进安装程序。 - 如何处理权限问题,确保应用程序能够正确连接和操作...

    C#打包安装数据库教程

    这可以通过安装程序如WiX工具集或Inno Setup实现,它们允许在安装过程中运行SQL脚本来创建或附加数据库。 对于安装程序的制作,WiX工具集是一个开源解决方案,它可以创建Windows Installer MSI包。通过XML格式的源...

    NSIS 安装包制作仿酷狗界面

    做了一套基于IIS, sql server 的安装包。全部通过页面输入变量获取, 所有刷库,修改xml,iis配置通过脚本完成。 界面正在研究中,附件为仿酷狗的界面。 如果有什么疑问可以一起讨论怎么调用IIS, 修改, 文件替换...

    速达3000STD865Setup.zip

    "ikernel.ex_"可能是ikernel.dll的压缩部分,这是Inno Setup安装程序的一个关键组件,负责处理安装过程中的动态链接库(DLL)加载和解压。这个文件在安装过程中会被恢复为完整的ikernel.dll,参与到软件的安装和执行...

    32位的BDE程序

    8. `SETUP.INS`:这是Inno Setup的安装脚本文件,描述了安装过程的细节,如文件位置、注册表项等。 9. `_SETUP.LIB`:可能是用于安装过程的库文件,包含了某些特定功能的实现。 10. `SETUP.PKG`:这通常是安装包的...

    mapx4.5,win7下可用

    而“Mapx45setup.iss”则是一个Inno Setup脚本文件,通常用于定义安装过程中的各种参数和设置,如安装路径、文件解压逻辑等。Inno Setup是一个免费的安装制作工具,它能够创建Windows安装包,这里的.iss文件就是用来...

    Delphi数据库编程讲座.doc

    Delphi提供了一些工具,如Inno Setup,用于创建安装脚本,包含数据库驱动、应用程序文件和配置信息,确保程序能在目标系统上正确运行。 四、高级话题 如果时间和篇幅允许,作者还计划介绍SQL Server的使用,这是一...

    安装文件 制作安装文件

    4. "kill.sql":一个SQL脚本,可能用于清理数据库,准备安装新的版本或设置初始数据。 5. "adsutil.vbs"、"mkw3site.vbs"、"mkwebdir.vbs"、"delweb.vbs":这些是VBScript文件,通常用于自动化IIS(Internet ...

    Windows 记事本替代工具 Notepad3 5.21.227.1 + x64.zip

    INI,Inno Setup,Java,JavaScript,LaTeX,Lua,Markdown,NSIS,Pascal,Perl,PHP,Python,REG,Ruby,SQL,Tcl,Visual Basic(VB),VBScript,VHDL 脚本,XHTML,XML,YAML ,D 源脚本,Go 源脚本,JSON,...

    BSQL1.6中文版RAR

    http://www.innosetup.com/ __________________________________________________________ 版权所有 (c) 2006-2009 贝恩软件 保留所有权利 Copyright (c) 2006-2009 BAINSOFT ALL RIGHTS RESERVED website: ...

    用C#生成安装程序

    2. **编写脚本**:使用Inno Setup工具编写安装脚本,脚本中需要指定文件复制路径、注册表设置以及.NET Framework和SQL Server驱动程序的安装选项。 3. **自定义界面**:设置安装程序的启动图标、欢迎屏幕和进度条...

    Delphi自动创建数据库并配置安装程序.rar

    2. **数据库创建脚本**:程序可能会包含SQL脚本,用于在运行时创建数据库结构,包括表、视图、存储过程等。这些脚本可以在连接成功后执行,以确保目标机器上存在正确的数据库结构。 3. **安装向导集成**:安装程序...

    FMSoft uniGUI Complete - Professional Edition v1_90_0_1534.rar

    Inno Setup是一款免费的Windows安装程序制作工具,开发者可以通过编写这个脚本配置安装过程,如文件复制、注册表操作、启动菜单项创建等。 "CodeSection.txt" 可能包含的是框架的源代码或特定功能的文档,帮助开发者...

Global site tag (gtag.js) - Google Analytics