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

系统 1756 0
原文: 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]'
      
      
        />
      
    
   这里声明了连接数据库的用户名和密码,它们的值引用了DBConfigDlg对话框中用户名和密码输入框的属性值
   然后我们添加一个 Component ,作为安装数据库的组件,并且将它包含在单独的ComponentGroup下:
      

< 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脚本

    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) 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是生成初始数据的脚本:
      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 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

    5.4  本地化

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

 

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

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论