Installshield11.5 创建 SQLserver 数据库 目的:仅介绍如何通过 IS 来创建数据库,是自己摸索 IS 的一点心得,并不推荐在实 际应用中使用这种方法。 限制:仅描述了在 IS 环境下,通过 SQL 脚本来建立数据库,没有包括其他建库手段, 比如说恢复。 重点: 介绍了通过 IS 如何联接数据库服务 介绍了如何在 IS 中加入脚本并执行 介绍了如何在安装包运行过程中替换脚本中的特定字符,来实现动态决定数据库的创 建路径 包含了部分脚本的使用说明 要求:基本掌握 IS,基本掌握 SQLserver。 说明:本人水平有限,在本文中为了说清楚问题,不保证所描述的内容是科学的,只 保证结果是正确的。
1 数据库简介 通常一个简单的 C/S 程序在发布时,要求在服务端将数据库一并创建到目标机器的 SQL 服务中。这时候,我们应该得到如下几个的建库脚本文件,或者是包含如下全部内 容的的脚本文件:
1.1 创建一个空数据库的脚本。 --创建数据库 IS_CreateDatabase IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IS_CreateDatabase') DROP DATABASE [IS_CreateDatabase] GO CREATE DATABASE [IS_CreateDatabase]
ON (NAME = N'Cactus_Data',
FILENAME = N'C:\IS_CreateDatabase.mdf' , SIZE = 102, FILEGROWTH = 10%) LOG
ON
(NAME
=
N'Cactus_Log',
FILENAME
=
N'C:\IS_CreateDatabase_log.ldf' , SIZE = 6, FILEGROWTH = 5%) GO --结束
脚本说明:一个数据库实际上在本地硬盘对应两个物理文件,数据文件“.mdf”和日 志文件“.log”。在这个建库脚本中,这两个文件默认被创建在 C 盘根目录,我们在后面
的制作安装包中,会讲解如何在运行时更改这个路径
1.2 在这个数据库中建表,建视图,建存储过程的脚本。 --创建两个表 USE [IS_CreateDatabase] GO CREATE TABLE [dbo].[IS_TESTTABLE] ( [id] [int] IDENTITY (1, 1) NOT NULL , [name] [varchar] (100) , [old]
[int] ,
[memo] [varchar] (100) ) ON [PRIMARY] GO --在这里可添加建视图脚本,建存储过程脚本 --建表结束
1.3 在这个数据库中插入程序运行的基本数据,也就是初始化数据。 --初始化数据 USE [IS_CreateDatabase] GO INSERT INTO IS_TESTTABLE([name],old,memo) VALUES('IS 使用者',30,'SQL 建库测试') GO --初始化结束
2 开始 IS 历程 这里不对每一步骤进行详细说明了,只在和 SQL 有关的地方进行解释,不明白的地 方请参考论坛中的《IS 入门指南》
2.1 建立新工程 这里依然使用 InstallScript llScript MSI Project 工程类型,是出于本人的习惯,具体也解释不
清楚,感觉这个工程类型功能比较全。
2.2 进入向导
继续,直到出现下面的画面,稍作修改:
修改默认的安装路径。继续………..
选择 CD-RO M,然后选择 Build Installstions,编程生成安装程序的主体结构。 进入到 IS 主界面,选择 SQL Scripts,右键点击界面中的 SQL Scripts,建立一个新联接。 这个联接是用来联接要创建数据库的数据库服务器,在建立一个新联接后,开始设置 联接时默认的参数:服务器名,我们默认设置为“(local) ” ,身份认证我们选择 SQL 服务 验证,用户名默认为“SA”即可。
在新创建的联接上右键,选择 Insert Script files,来导入我们先前做好的建库脚本。 导入完成后,得到如图结果。
数据库设置基本完成。这时候,一个通过 IS 来创建数据库的安装包基本上就就绪了,
你完全可以进行编译后执行。大家可以去试一下。
2.3 这个安装包存在的最大问题: 数据库文件被创建在了 C 盘根目录,也就是我们在安装时无法指定数据库文件的安 装目录。这个问题的解决,也是这个教程中唯一的亮点,就是如何更改数据库建库脚本中 的固定目录,允许用户在安装过程中,选择或输入安装路径。
2.4 更改安装路径 首先要明白一点:IS 本身不会创建数据库,IS 只是提供了安装时可以执行 SQL 脚本 的一种环境,在这个环境中,你可以用 SQL 脚本来实现数据库的一些操作。所以,基于 这么一个认识,我们要想在建库时改变建库文件的创建路径,唯一可以做的就是在 IS 执 行 SQL 脚本前,替换掉 SQL 脚本中的原路径字符“C:\”,换成我们自己输入的路径字符, 比如说“D:\SQLDATA”等。而 IS 正好提供了我们这样的功能。 我们选择一个 SQL 脚本项,看到右侧窗口上有一项叫“Text Replacement”。
在这里,我们可以完成对这个 sql 脚本中的指定的字符串替换成另外一个字符串。这种替 换是在安装时进行的。
比如,我们点击界面中的 ADD,弹出查找/替换对话框,在查找中我们输入 C:\,替 换中我们输入 D:\SQLDATA,那么在安装时,在 CreateDatabase.sql 脚本中所有的字符串
C:\都会别替换成 D:\SQLDATA。 但是,这还并不是我们需要的,因为,数据库要安装在哪个目录,是在安装时才知道 的,比如 INSTALLDIR 这个变量是在安装时才知道,所以,我们可以在替换的位置上输 入[INSTALLDIR]。这样,在安装时,我们选择了安装的目录,执行建库语句时,“C:\” 便被替换成了程序的安装路径,达到指定路径的目的。 再进一步:用 INSTALLDIR 来替换数据库的安装路径有时候不合适,比如,假设我 们这个安装包中包括了程序文件的安装和数据库的创建,而安装要求程序的安装路径和数 据库库文件的生成路径要完全不同,这时候,我们就无法用 INSTALLDIR 来替换建库脚 本中“C:\”,必须要使用自定义的变量来获取用户指定的路径,然后替换建库脚本中的 “C:\”。 用变量获取用户指定的路径,这个我们应该都没有问题,这里重点解释一下如何将这 个获取的路径传递到建库脚本中并进行替换。 假设,我们获取用户指定的路径变量为 userDir(使用 AskPath 函数来让用户安装时 给这个变量赋值――选择路径)。 我们在 Property Manager 中,新建一个项,记住要全部大写(我不知道怎么翻译好, 就叫 IS 的特征变量吧),随便给他个默认值。
这样,我们在 SQL 的替换界面中就能看到这个 IS 的特征变量了。
接下来,我们自然想到就是将 userDir 的值赋给 DBPATH 就万事大吉了。哈哈,用这 个函数吧:MsiSetProperty(ISMSI_HANDLE, "DBPATH",userDir);具体用法看 IS 的帮助 吧 OK,收工!