??? 很多人在使用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制作升級包和補丁
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

