InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法

简述


InstallShield已经内建了对MySQL和Oracle的支持。但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报错。

一般来说,数据库脚本只保证通过官方客户端测试即可,同时维护一份供IS执行的脚本费时费力。因此,考虑安装程序对两数据库的支持通过官方客户端实现。

MySQL





 
function InstallMySQLComponent(szComponent)
NUMBER nResult;
STRING szServer,szDB,szUser,szPassword,sCMD,sOPT,sResult1,sResult2,svLine,sMsg,sPath;
NUMBER nvFileHandle,nvCount;
LIST listStatus;
begin
sMsg = ‘安装‘+szComponent+‘ ...‘;
SdShowMsg(sMsg, TRUE);
// source命令不认识windows路径中的反斜杠,故将SRCDIR中的反斜杠替换成斜杠
sPath = SRCDIR;
StrReplace(sPath, ‘//‘, ‘/‘, 0);
// Fetch database connection information
SQLRTGetConnectionInfo( ‘mysql‘, szServer, szDB, szUser, szPassword );
sCMD = WINSYSDIR^‘cmd.exe‘;
sOPT = ‘ /c ‘+SRCDIR^‘mysql.exe -h‘+szServer+‘ -u‘+szUser+‘ -p‘+szPassword+‘ -D‘+szDB;
sOPT = sOPT+‘ -e "source ‘+sPath^szComponent+‘.sql" > ‘+SRCDIR^‘dbstatus.txt 2>&1‘;
// Execute the script associated with the given component in database
nResult=LaunchAppAndWait(sCMD, sOPT, WAIT|LAAW_OPTION_HIDDEN);
if (nResult < 0) then
MessageBox(‘Failed installing ‘+szComponent+‘ !‘, SEVERE);
abort;
endif;
// 关闭安装提示
SdShowMsg(‘‘, FALSE);
// Read dbstatus.txt
OpenFileMode(FILE_MODE_NORMAL);
if (OpenFile(nvFileHandle, SRCDIR, ‘dbstatus.txt‘)<0) then
MessageBox(‘Failed checking the status of installing ‘+szComponent+‘ !‘, SEVERE);
abort;
endif;
listStatus = ListCreate(STRINGLIST);
while GetLine(nvFileHandle, svLine) = 0
ListAddString(listStatus, svLine, AFTER);
endwhile;
CloseFile(nvFileHandle);
// Count how many lines fetched from dbstatus.txt
nvCount = ListCount(listStatus);
if nvCount > 0 then
sMsg = "更新数据库出错,点“是”打开日志文件并退出安装,点“否”直接退出安装。/n";
sMsg = sMsg+"若错误可忽略,可选择数据库类型“none”以跳过数据库更新并直接更新程序,/n";
sMsg = sMsg+"然后在数据库中手工执行SQL脚本(安装后保存在script目录下)";
nResult = AskYesNo(sMsg, YES);
if (nResult = YES) then
LaunchApp(WINSYSDIR^‘notepad.exe‘, SRCDIR^‘dbstatus.txt‘);
endif;
abort;
endif;
end;

Oracle





 
function InstallOracleComponent(szComponent)
NUMBER nResult,nvFileHandle,nIndex,nvCount;
STRING sMsg,szServer,szDB,szUser,szPassword,sCMD,sOPT,sInstance,sTmp,svLine;
LIST listStatus;
begin
sMsg = ‘安装‘+szComponent+‘ ...‘;
SdShowMsg(sMsg, TRUE);
// Fetch database connection information
SQLRTGetConnectionInfo( ‘oracle‘, szServer, szDB, szUser, szPassword );
nIndex = StrFind(szServer, ‘:‘);
nIndex = StrFindEx(szServer, ‘/‘, nIndex);
StrSub(sInstance, szServer, nIndex+1, 100);
sCMD = WINSYSDIR^‘cmd.exe‘;
sOPT = ‘ /c ‘+‘sqlplus.exe -L -S ‘+szUser+‘/‘+szPassword+‘@‘+sInstance;
sOPT = sOPT+‘ @‘+SRCDIR^szComponent+‘.sql > ‘+SRCDIR^‘dbstatus.txt 2>&1‘;
// Execute the script associated with the given component in database
nResult=LaunchAppAndWait(sCMD, sOPT, WAIT|LAAW_OPTION_HIDDEN);
if (nResult < 0) then
MessageBox(‘Failed installing ‘+szComponent+‘ !‘, SEVERE);
abort;
endif;
// 关闭安装提示
SdShowMsg(‘‘, FALSE);
// 在dbstatus.txt中查询字符串holytail,如果存在,说明脚本已执行完
if (FileGrep(SRCDIR^‘dbstatus.txt‘, ‘holytail‘, svLine, nIndex, RESTART) = 0) then
// 在dbstatus.txt中查询字符串ORA-,如果存在,说明脚本执行出现错误
if (FileGrep(SRCDIR^‘dbstatus.txt‘, ‘ORA-‘, svLine, nIndex, RESTART) = 0) then
sMsg = "更新数据库出错,点“是”打开日志文件并退出安装,点“否”直接退出安装。/n";
sMsg = sMsg+"若错误可忽略,可选择数据库类型“none”以跳过数据库更新并直接更新程序,/n";
sMsg = sMsg+"然后在数据库中手工执行SQL脚本(安装后保存在script目录下)";
nResult = AskYesNo(sMsg, YES);
if (nResult = YES) then
LaunchApp(WINSYSDIR^‘notepad.exe‘, SRCDIR^‘dbstatus.txt‘);
endif;
abort;
endif;
else
sMsg = "更新数据库出错,点“是”打开日志文件并退出安装,点“否”直接退出安装。/n";
sMsg = sMsg+"若错误可忽略,可选择数据库类型“none”以跳过数据库更新并直接更新程序,/n";
sMsg = sMsg+"然后在数据库中手工执行SQL脚本(安装后保存在script目录下)";
nResult = AskYesNo(sMsg, YES);
if (nResult = YES) then
LaunchApp(WINSYSDIR^‘notepad.exe‘, SRCDIR^‘dbstatus.txt‘);
endif;
abort;
endif;
end;

总结


  1. 为便于获取脚本在数据库中的执行结果,故通过官方客户端执行脚本时通过符号“>”将客户端的输出信息重定向到dbstatus.txt中;同时,使用“2>&1”将标准错误输出重定向到标准输出设备上,当然,会进一步重定向到dbstatus.txt文件中,否则,无法获取出错信息。

  2. sqlplus执行SQL脚本后不会自动退出,故应在Oracle的脚本后加上语句“exit;”。

  3. 重载OnSQLComponentInstalled()函数,并在其中禁止MySQL和Oracle的SQL脚本对应的Component被执行安装,然后通过以上两个函数更新数据库。

InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法,布布扣,bubuko.com

时间: 2024-08-02 10:59:22

InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法的相关文章

MySql常见数据类型,SQL执行顺序,条件语句,转储,查看表中字段属性

数据类型: 1 数字: Tinyint:小数据 用于保存一些范围的整数数值范围 有符号: -128-127 无符号: 0-255 int 整数 数据类型用于保存一些范围的整数数值范围 有符号: -2147483648--2147483647 无符号: 0-4294967295 Bigint 大整数 数据类型用于保存一些范围的整数数值范围: 有符号: -9223372036854775808--9223372036854775807 无符号: 0-18446744073709551615 floa

Mybaits 源码解析 (七)----- Select 语句的执行过程分析(下篇)(Mapper方法是如何调用到XML中的SQL的?)全网最详细,没有之一

我们上篇文章讲到了查询方法里面的doQuery方法,这里面就是调用JDBC的API了,其中的逻辑比较复杂,我们这边文章来讲,先看看我们上篇文章分析的地方 SimpleExecutor 1 public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLExcep

Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

Oracle 是如何工作的? Select id,name from t order by id ; – SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限) – 执行计划(ORACLE如何访问数据,按照执行计划取数据) – 执行SQL • 从磁盘中读取数据(如果数据在内存中没有,就去磁盘读取) • 数据处理(数据读到内存后,就进行处理.排序,组合等处理) • 返回结果(把结果返回给用户) Insert into t values(1,‘tigerfish’); – SQL

Yii2中多表关联查询(join、joinwith) with是不执行sql的

Yii2中多表关联查询(join.joinwith) 我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id book_id) 图书表 (id book_name author_id) 作者表 (id author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer extends \

oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered

问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个pdm文件 2. 建表后预览sql 是有clustered 这个关键字的 3. 建表时报错 问题解决 调查发现数据库的问题,右键数据库属性 查看DBMS 发现是 SQL SERVER ! 解决办法就是切换DBMS: 点击确定 再次查看sql语句,一切正常.问题最终解决.

SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变

前提  本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段的统计信息做数据行数预估的算法原理,以及SQL Server 2012和SQL Server 2014该算法的差异情况, 这里暂时不涉及复合统计信息,暂不涉及统计信息的更新策略及优化相关话题,以及其他SQL Server版本计算方式. 统计信息是什么 简单说就是对某些字段的数据分布的一种描述,让SQ

mysql中获取一天、一周、一月时间数据的各种sql语句写法

今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中部分名词或函数进行了解释说明.直入主题! 创建表:create table if not exists t(   id int,   addTime datetime default ’0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, ’2012-07

如何将.SQL文件的数据导入到Mysql的数据库中

一.用cmd的调试环境导入.sql文件中的数据: WinR键打开cmd输入: MySQL -u root -p 进入MySQL后MySQL>use DR;   MySQL> source c:/DR.sql 注意上面的 DR是你事先创建好的文件夹,创建在Mysql的data目录下面,DR.sql是你下载的数据库的内容,注意DR.sql是要放在磁盘的最外层目录的,否则无法导入数据. 二.用Mysql Workbence调试环境导入数据: 打开Mysql Workbence软件,选择Data Im

sql学习笔记(17)----------MySQL命令

Mysql常用命令详解 Mysql安装目录 数据库目录 /var/lib/mysql/ 配置文件 /usr/share/mysql(mysql.server命令及配置文件) 相关命令 /usr/bin(mysqladmin mysqldump等命令) 启动脚本 /etc/init.d/mysql(启动脚本文件mysql的目录) 系统管理 连接MySQL 格式: mysql -h 主机地址 -u用户名 -p用户密码 例 1:连接到本机上的 MySQL. [email protected]:~$ m