亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Wix打包系列(五) 部署數據庫

系統 1891 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條評論
主站蜘蛛池模板: 国产精品免费观在线 | 成人a毛片久久免费播放 | 久久精品五月天 | 国产伦精品一区二区三区无广告 | 久久久国产亚洲精品 | 国产精品久热 | 香蕉视频免费在线看 | 五月花精品视频在线观看 | 国产a免费 | 国产精品v免费视频 | 九九伊人网 | 一级毛片日本特黄97人人 | 欧美一级毛片日韩一级 | 亚洲一区综合 | 久久成人免费 | 国产伦精品一区二区三区在线观看 | 青草国产视频 | 久久免费视频在线观看30 | 一本一道波多野结衣一区二区 | 97视频免费看 | 五月花精品视频在线观看 | 激情五月五月婷婷 | 夜色资源站www国产在线资源 | 激情五月婷婷红人馆 | 久久精品视频大全 | 国产精品你懂的在线播放 | 国产a免费| 免费九九视频 | 免费播放毛片 | 精品欧美在线精品 | 久久激情影院 | 亚洲国产成人精品91久久久 | 日本在线小视频 | 久久99亚洲精品久久频 | 国产一级αv片免费观看 | 一区二区三区免费视频 www | 青青青青在线成人视99 | 欧美午夜片| 一区二区三区精品视频 | 久久久免费网站 | 国产片91人成在线观看 |