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 ...
随机推荐
- AVL树的插入删除查找算法实现和分析-1
至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法. 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和 ...
- ASP.NET - 使用 XML
对XML文件进行简单的增加,删除,修改,查看等功能. XML代码: <?xml version="1.0" encoding="UTF-8"?> & ...
- 论文阅读笔记 - YARN : Architecture of Next Generation Apache Hadoop MapReduceFramework
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 更多论文阅读笔记 http:/ ...
- 让程序在崩溃时体面的退出之Dump文件
在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但 ...
- uva 10951 - Polynomial GCD(欧几里得)
题目链接:uva 10951 - Polynomial GCD 题目大意:给出n和两个多项式,求两个多项式在全部操作均模n的情况下最大公约数是多少. 解题思路:欧几里得算法,就是为多项式这个数据类型重 ...
- 表likp新增第一次过账输入日期字段,vl02n/vl01n/vl03n/vl06o的增强
在程序:MV50AFZ1的 FORM USEREXIT_SAVE_DOCUMENT_PREPARE. *begin of ADD CRQ000000012135 CAIZJIAN 2014/3/25( ...
- 0 and 1
Description Andrewid the Android is a galaxy-famous detective. In his free time he likes to think ab ...
- Html.Partial("")与Html.RenderPartial("")区别
文章有点长,但大多是代码,看看很快的,不要压力太大.网上有很多关于这两个方法的区别,都说出了它本质的区别(不看代码,只看这个结论,就已经足够了,如果觉得有必要从代码中得出这个结论,那就继续往下看),这 ...
- TDD测试驱动的javascript开发(3) ------ javascript的继承
说起面向对象,人们就会想到继承,常见的继承分为2种:接口继承和实现继承.接口继承只继承方法签名,实现继承则继承实际的方法. 由于函数没有签名,在ECMAScript中无法实现接口继承,只支持实现继承. ...
- Nubia Z5S 基于官方H207/4.4内核的Mokee4.4.4 RC3.2 (2014.7.31修复呼吸灯(能亮依旧不能呼吸))
特别感谢 yun3195 和 轻描淡写Yhw 帮忙測试 转帖请务必注明本链接地址: http://blog.csdn.net/syhost/article/details/36444259 此ROM ...