打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Wix打包系列(五) 部署数据库
userphoto

2023.04.20 加拿大

关注

原文:Wix打包系列(五) 部署数据库

很多人在使用vs进行打包的时候,经常会为数据库部署的问题犯愁,即便是重写Installer类的方法,也不是很可靠方便,下面我们来看看在wix中如何部署数据库。

5.1 创建数据库

    wix包含数据库的相关链接库,需要为wix添加如下命名空间:

  1. <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添加如下声明语句:

  1. <util:User Id='SQLUser' Name='[DBUSERNAME]' Password='[DBPASSWORD]' />
   这里声明了连接数据库的用户名和密码,它们的值引用了DBConfigDlg对话框中用户名和密码输入框的属性值
   然后我们添加一个Component,作为安装数据库的组件,并且将它包含在单独的ComponentGroup下:
  1.  
  2. <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'
  3.  
  4. 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>
  5.  
  6. ...
    </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语句:
  1. <Binary Id='CreateDBObj' SourceFile='$(var.Version)/CreateObject.sql' />
    <Binary Id='CreateDBRecords' SourceFile='$(var.Version)/CreateRecords.sql' />
    CreateObject.sql是创建数据库对象的语句,可以直接使用从sql server中生成sql脚本,这里稍作修改,以便于更改或修复数据库的时候也使用该脚本。
  1. 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
    CreateRecords.sql是生成初始数据的脚本:
  1. 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列表中添加一项:
  1. <Feature Id='SqlConfigFeature' Title='Database' Description='Sql Server Config.' Level='1'>
    <ComponentGroupRef Id='DataBaseGroup'/>
    </Feature>
   最后我们就可以编译链接代码了,由于引用了数据库组件,因此编译时要添加相应的选项:
  1. 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
    5.4  本地化

WixSqlExtension是wix自带的组件,本身只包含英文的资源,要在安装时显示中文资源则需要从 WixSqlExtension组件中提取出英文的资源文件,然后翻译为中文的资源文件;WixSqlExtension的中文资源文件在网上找不到的,有需要的可以点击这里下载。

下一章节我们将介绍如何使用wix制作升级包和补丁

Wix打包系列(五) 部署数据库的更多相关文章

  1. Wix打包系列(四) 自定义UI

    原文:Wix打包系列(四) 自定义UI 除了标准的安装界面,如果我们要在安装时需要提供一些额外的信息时,这时就需要自定义界面来显示和录入这些信息. 4.1  自定义对话框 如上一章中我们测试数据库的连 ...

  2. Wix打包系列(三)自定义Action(Custom Action)

    原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...

  3. Wix打包系列(一)如何使用wix制作安装程序

    原文:Wix打包系列(一)如何使用wix制作安装程序 最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费 ...

  4. Wix打包系列(七) 添加系统必备组件的安装程序

    原文:Wix打包系列(七) 添加系统必备组件的安装程序 我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件.这里以.Net Fr ...

  5. Wix打包系列 (六)制作升级和补丁包

    原文:Wix打包系列 (六)制作升级和补丁包 前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢? 在这之前,我 ...

  6. Wix打包系列(二)用户界面和本地化操作

    原文:Wix打包系列(二)用户界面和本地化操作 上一章节,我们已经大概知道如何对文件进行打包安装,不过我们也注意到,通过对Sample.wxs的编译链接,生成的msi安装包没有任何用户界面,只有一个安 ...

  7. Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

    一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...

  8. DevOps 工程师成长日记系列五:部署

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-5-deploy ...

  9. 基于Extjs的web表单设计器 第五节——数据库设计

    这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...

随机推荐

  1. poj 百练 2765 八进制小数(精度问题)

    2765:八进制小数 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描写叙述 八进制小数能够用十进制小数精确的表示.比方,八进制里面的0.75等于十进制里 ...

  2. Servlet的学习(四)

    在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节. 细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中 ...

  3. Windows下用Mingw编译Boost.Regex库

    下载Boost库,解压. 定位到regex库文件夹下. GCC所对应的MAKEFILE为gcc.mak 进入命令提示符下,输入make -f gcc.mak 这是如果直接按回车执行的话,会出现错误: ...

  4. java实现点卡生成

    点卡主要有2部分:卡号和密码.卡号一般由数字组成,密码就不多说了. java中随机数很强大,大家可以自己查.卡号生成使用java中随机数,密码使用uuid,密码可以自己再加点东西之类的.下面是完整代码 ...

  5. Passenger/Nginx/Debian快速部署Rails

    安装所需的linux包 sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl gi ...

  6. HDU2504 又见GCD

    又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. 百度地图new BMap.LocalCity() 问题

    <html> <head> <meta http-equiv='Content-Type' content='text/html; char ...

  8. Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

    原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...

  9. grep、sed、awk、perl、js、vim等对正则表达式的支持的差别

    grep.sed.awk.perl等对正则表达式的支持的差别 grep 2.5.1 egrep 2.5.1 sed 3.02 sed 4.07 awk 3.1.1 perl 5.8.0 vim 6.1 ...

  10. C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。

    在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc ...

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Robot压力测试实例
MSSQL2008R2 高版本降迁至SQL2005低版本
数据库干货:整理SQLServer非常实用的脚本
数据库性能问题总结--屡次发生的Oracle谓词越界
SQL Server 2012入门图解(二):SQL语句入门
通过作业,定时同步两个数据库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服