Wix打包系列(五) 部署数据库
来源:互联网 发布:淘宝app充值为什么便宜 编辑:程序博客网 时间:2024/06/06 03:42
很多人在使用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]'/>
这里声明了连接数据库的用户名和密码,它们的值引用了DBConfigDlg对话框中用户名和密码输入框的属性值
然后我们添加一个Component,作为安装数据库的组件,并且将它包含在单独的ComponentGroup下:
<Fragment> <ComponentGroup Id="DataBaseGroup"> <Component KeyPath="yes" Id='SqlComponent' Directory ='INSTALLDIR' Guid='{94443B4E-46D4-4edb-A188-0C8074CFF946}'> <sql:SqlDatabaseId='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脚本
SqlDatabase 里定义了两个SqlScript,它是执行sql脚本文件的语句,因此还要添加2个Binary文件,里面包含我们执行数据库建表和初始数据的sql语句:
<Binary Id='CreateDBObj 'SourceFile='$(var.Version)/CreateObject.sql'/><Binary Id='CreateDBRecords' SourceFile='$(var.Version)/CreateRecords.sql'/>
CreateObject.sql是创建数据库对象的语句,可以直接使用从sql server中生成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) COLLATEChinese_PRC_CI_AS NULL , [sex] [varchar] (50) COLLATEChinese_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) COLLATEChinese_PRC_CI_AS NULL , [NameCn] [nvarchar] (50) COLLATEChinese_PRC_CI_AS NULL , [Short] [varchar] (50) COLLATE Chinese_PRC_CI_ASNULL) 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 ONGOSET ANSI_NULLS ONGO CREATE VIEWdbo.vw_PeopleASSELECT TOP 100 PERCENT id, name, sexFROM dbo.peopelORDER BY id GOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO
CreateRecords.sql是生成初始数据的脚本:
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
SqlScript 是sql脚本的语句,Sequence属性设置执行的顺序,ExecuteOnInstall和ExecuteOnReinstall设置是否在install或者Reinstall时执行;
需要注意的是,这里的所有Reinstall操作都设置为no,也就是说在修复和更改安装的时候不会执行数据库脚本的语句,如果在安装的录入的数据库信息有修改,那么将不能把Reinstall相关的操作设置为yes,因为示例中Reinstall模式不会有数据库信息录入界面,那么数据库相关的属性将是我们定义的默认值,而不会是在Install模式下输入的值。要想在Reinstall模式下修复数据库,需要进行以下步骤操作:
1、添加CustomAction,在Install的时候执行(即执行条件为Not Installed),执行顺序在InstallFinalize之后,该Action将用户修改后的数据库连接串保存到安装目录下的config配置文件中
2、添加CustomAction,在ReInstall的时候执行(即执行条件为Installed),执行顺序在InstallInitialize之前,该Action将从安装在安装目录下的配置文件中读取数据库连接串,然后改变DBNAME等属性的值为连接串中相关属性的值
3、设置ExecuteOnReinstall属性为yes
这里我们就不提供示例了,理解了前面几章内容的话应该很容易实现的;另一种方法是将DBConfigDlg对话框插入到维护模式的UI列表中,让更改和修复安装时也可以录入数据库信息,不过感觉这么做不是很好。
5.3 编译运行
由于运行数据库的Component是放在单独的ComponentGroup中, 这个ComponentGroup并没有包含在安装的Feature列表中,因此我们需要在Feature列表中添加一项:
<Feature Id='SqlConfigFeature' Title='Database' Description='Sql ServerConfig.' 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 -locWixUI_zh-cn.wxl -ext WixUIExtension -extWixUtilExtension -ext WixSqlExtension -out 1.0.0/Sample.msi 1.0.0/Sample.wixobj1.0.0/DbConfigDlg.wixobj
5.4 本地化
WixSqlExtension是wix自带的组件,本身只包含英文的资源,要在安装时显示中文资源则需要从 WixSqlExtension组件中提取出英文的资源文件,然后翻译为中文的资源文件;WixSqlExtension的中文资源文件在网上找不到的,有需要的可以点击这里下载。
下一章节我们将介绍如何使用wix制作升级包和补丁
- Wix打包系列(五) 部署数据库
- Wix打包系列(五) 部署数据库
- Wix打包系列(五) 部署数据库
- Wix打包系列(五) 部署数据库
- Wix打包系列(四) 自定义UI
- Wix打包系列(四) 自定义UI
- Wix打包系列(四) 自定义UI
- Wix打包系列(四) 自定义UI
- Wix打包系列(一)如何使用wix制作安装程序
- Wix打包系列(一)如何使用wix制作安装程序
- Wix打包系列(一)如何使用wix制作安装程序
- Wix打包系列(一)如何使用wix制作安装程序
- Wix打包系列(一)如何使用wix制作安装程序
- Wix打包系列(二)用户界面和本地化操作
- Wix打包系列(三)自定义Action(Custom Action)
- Wix打包系列 (六)制作升级和补丁包
- Wix打包系列(二)用户界面和本地化操作
- Wix打包系列(三)自定义Action(Custom Action)
- 从10w条记录随机取出n条记录高效率解决方案
- 版本控制与常见的分支模型
- JavaScript概念之screen/client/offset/scroll/inner/avail的width/left
- 微信公众号上传多媒体文件
- python安装simplejson
- Wix打包系列(五) 部署数据库
- PB函数大全(超全,解析很全面)
- 照片墙的Adapter——Android照片墙应用实现,再多的图片也不怕崩溃
- 018使用Http协议从网络上下载文件
- 多线程之进度条JProgressBar
- 关于ubuntu Linux 系统用startx进入X-windows然后重启无限登陆的解决方式
- 浏览器引擎、网页引擎、搜索引擎
- 树莓派Debian开机启动项(rc.local)
- R语言set.seed()函数的意义以及用法