很多人在使用vs进行打包的时候,经常会为数据库部署的问题犯愁,即便是重写Installer类的方法,也不是很可靠方便,下面我们来看看在wix中如何部署数据库。
5.1 创建数据库
wix包含数据库的相关链接库,需要为wix添加如下命名空间:
<
Wix
xmlns
="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util
='http://schemas.microsoft.com/wix/UtilExtension'
xmlns:sql
='http://schemas.microsoft.com/wix/SqlExtension'
>
接着在 Product 添加如下声明语句:
<
util:User
Id
='SQLUser'
Name
='[DBUSERNAME]'
Password
='[DBPASSWORD]'
/>
<
Fragment
>
<
ComponentGroup
Id
="DataBaseGroup"
>
<
Component
KeyPath
="yes"
Id
='SqlComponent'
Directory
='INSTALLDIR'
Guid
='{94443B4E-46D4-4edb-A188-0C8074CFF946}'
>
<
sql:SqlDatabase
Id
='SqlDatabase'
Database
='[DBNAME]'
User
='SQLUser'
Server
='[SERVERNAME]'
ConfirmOverwrite
='yes'
CreateOnInstall
='yes'
CreateOnReinstall
='no'
DropOnUninstall
='no'
DropOnReinstall
='no'
ContinueOnError
='no'
>
<
sql:SqlScript
Id
='CreateObjSQLScript'
ExecuteOnInstall
='yes'
ExecuteOnReinstall
='no'
BinaryKey
='CreateDBObj'
Sequence
='1'
/>
<
sql:SqlScript
Id
='CreateRecordsSQLScript'
ExecuteOnInstall
='yes'
ExecuteOnReinstall
='no'
BinaryKey
='CreateDBRecords'
Sequence
='2'
/>
</
sql:SqlDatabase
>
</
Component
>
</
ComponentGroup
>
...
</
Fragment
>
sql:SqlDatabase 标签的User属性是前面定义的 util:User 标签的Id标识;
Database
和
Server
属性是数据库名称和服务器名称,它们都引用了DBConfigDlg对话框中数据库和服务器输入框的属性值;
CreateOnInstall
属性设置是否在安装的时候创建数据库,设置为yes,如果服务器上不存在名为[DBNAME]的数据库,则会创建该数据库,因此我们不需要编写创建数据库的脚本;如果数据库已存在,则会在存在的数据库上执行标签内部数据库操作,不会出现重复创建数据库的错误。如果想要在数据库已存在的情况提示用户是否覆盖安装数据库,则将
ConfirmOverwrite
属性设置为yes。
CreateOnReinstall 属性设置是否在Reinstall的时候创建数据库,设置为no,Reinstall的时候不会创建数据库,但是会执行数据库标签内部的 SqlScript 操作。这里的Reinstall是指修复、更改安装或者在命令行模式下使用Reinstall参数进行安装的情况下,而卸载后重新安装属于Install的范畴。
DropOnUninstall 属性设置是否在卸载程序的时候同时卸载安装数据库,这里最好设置为no,删除数据库可以直接在企业管理器中进行,如果设置为yes了,而数据库发生改变,会出现程序无法卸载的情况; DropOnReinstall 也是一样。
ContinueOnError 属性设置数据库安装错误的时候是否能继续整个程序的安装进度,如果设置为yes,则数据库安装出错时会弹出提示,点击继续后可以继续安装,设置为no,则会终止并回滚安装。
5.2 执行SQL脚本
<
Binary
Id
='CreateDBObj'
SourceFile
='$(var.Version)/CreateObject.sql'
/>
<
Binary
Id
='CreateDBRecords'
SourceFile
='$(var.Version)/CreateRecords.sql'
/>
if
exists (
select
* from dbo.sysobjects where id = object_id(N
'[dbo].[vw_People]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[vw_People]
GO
if
not
exists (
select
* from dbo.sysobjects where id = object_id(N
'[dbo].[peopel]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE [dbo].[peopel] (
[id] [int]
NOT
NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[sex] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
)
ON
[PRIMARY]
GO
if
not
exists (
select
* from dbo.sysobjects where id = object_id(N
'[dbo].[Country]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE [dbo].[Country] (
[NameEn] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[NameCn] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[
Short
] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
)
ON
[PRIMARY]
GO
if
exists (
select
object_name(parent_obj) from sysobjects where xtype=
'pk' and id = object_id(N'[dbo].[PK_peopel]'))
ALTER TABLE [dbo].[peopel] DROP CONSTRAINT [PK_peopel]
ALTER TABLE [dbo].[peopel]
WITH
NOCHECK ADD
CONSTRAINT [PK_peopel] PRIMARY KEY CLUSTERED
(
[id]
)
ON
[PRIMARY]
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE VIEW dbo.vw_People
AS
SELECT
TOP 100 PERCENT id, name, sex
FROM dbo.peopel
ORDER BY id
GO
SET
QUOTED_IDENTIFIER OFF
GO
SET
ANSI_NULLS
ON
GO
DELETE FROM [Country]
GO
INSERT INTO [Country] ([NameEn],[NameCn],[
Short
]) VALUES(
'China','中国','CN')
INSERT INTO [Country] ([NameEn],[NameCn],[
Short
]) VALUES(
'America','美国','US')
INSERT INTO [Country] ([NameEn],[NameCn],[
Short
]) VALUES(
'Japan','日本','JP')
GO
<
Feature
Id
='SqlConfigFeature'
Title
='Database'
Description
='Sql Server Config.'
Level
='1'
>
<
ComponentGroupRef
Id
='DataBaseGroup'
/>
</
Feature
>
candle.exe -dVersion=1.0.0 -ext WixUtilExtension -ext WixSqlExtension Sample.wxs DbConfigDlg.wxs -out 1.0.0/
light.exe -loc WixUI_zh-cn.wxl -ext WixUIExtension -ext WixUtilExtension -ext WixSqlExtension -out 1.0.0/Sample.msi 1.0.0/Sample.wixobj 1.0.0/DbConfigDlg.wixobj
WixSqlExtension是wix自带的组件,本身只包含英文的资源,要在安装时显示中文资源则需要从 WixSqlExtension组件中提取出英文的资源文件,然后翻译为中文的资源文件;WixSqlExtension的中文资源文件在网上找不到的,有需要的可以点击 这里 下载。
下一章节我们将介绍如何使用wix制作升级包和补丁

