Wix打包系列(五) 部署数据库
很多人在使用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制作升级包和补丁
Wix打包系列(五) 部署数据库的更多相关文章
- Wix打包系列(四) 自定义UI
原文:Wix打包系列(四) 自定义UI 除了标准的安装界面,如果我们要在安装时需要提供一些额外的信息时,这时就需要自定义界面来显示和录入这些信息. 4.1 自定义对话框 如上一章中我们测试数据库的连 ...
- Wix打包系列(三)自定义Action(Custom Action)
原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...
- Wix打包系列(一)如何使用wix制作安装程序
原文:Wix打包系列(一)如何使用wix制作安装程序 最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费 ...
- Wix打包系列(七) 添加系统必备组件的安装程序
原文:Wix打包系列(七) 添加系统必备组件的安装程序 我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件.这里以.Net Fr ...
- Wix打包系列 (六)制作升级和补丁包
原文:Wix打包系列 (六)制作升级和补丁包 前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢? 在这之前,我 ...
- Wix打包系列(二)用户界面和本地化操作
原文:Wix打包系列(二)用户界面和本地化操作 上一章节,我们已经大概知道如何对文件进行打包安装,不过我们也注意到,通过对Sample.wxs的编译链接,生成的msi安装包没有任何用户界面,只有一个安 ...
- Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...
- DevOps 工程师成长日记系列五:部署
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-5-deploy ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
随机推荐
- android第一天-------环境搭建
今天正式第一天学习android的. 1.昨晚下班后回家跟同事刘江龙打了四把dota.还好,都赢了把对面虐成狗了.大多都是1300到1450的局,玩的很爽. 2.dota打完后给在湖南常德的女朋友打了 ...
- Servlet的学习(四)
在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节. 细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中 ...
- 通过Jexus 部署 dotnetcore
通过Jexus 部署 dotnetcore版本MusicStore 示例程序 ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mo ...
- QT中.pro文件的写法
QT中.pro文件的写法 qmake 变量 含义 #xxxx 注释, 从“#”开始,到这一行结束 SOURCES 指定源文件 SOURCES = *.cpp 对于多源文件,可用空格分开 SOURC ...
- Qt显示调用vs中的dll
网上看到很多文章写调用vc的dll,但我尝试了总是出问题,下面结合参考别人的文章,实现了Qt显示调用vs中c接口的dll. 具体直接上代码: vs中的代码: TMax.h: #ifdef TMAX # ...
- 大容量XFS异常处理
今天在检查报警的时候发现部分数据异常,登陆备份机查看文件状态的时候发现磁盘空间已经满了,inode也已经有问题了,因此先停掉了所有的备份进程,开始检查问题. 首先是磁盘空间满了,尝试删除部分文件,发现 ...
- AFNetwork学习(二)——GET/POST请求
为了学习AFNetwork,自己搭建整理了一下AFNetwork向后台发送请求和后台返回json数据的整个处理过程.利用Struts2搭建了一个后台,提供Action并返回json数据 环境:Xcod ...
- c# 文件/文件夹操作
1.判断文件夹是否存在并创建 if (!Directory.Exists(tempFolderName)) { Directory.CreateDirectory(tempFolderName); }
- 将n进制的数组压缩成字符串(0-9 a-z)同一时候解压
比如一个3进制的数组: [1 1 2 2 2 0 0] 用一个字符串表示... 此类题目要明白两点: 1. 打表:用数组下标索引字符.同一时候注意假设从字符相应回数字: int index = (st ...
- 老罗android开发视频教程 下载地址
感觉老罗android开发视频教程讲得挺好挺全面的,适合新手学习.分享 老罗android开发视频教程 下载地址: 电驴:http://www.verycd.com/topics/2929580/ 老 ...