Wixパッケージシリーズ(5)配置データベース


多くの人が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識別子である.
データベースとサーバのプロパティは、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には2つのSqlScriptが定義されています.これはsqlスクリプトファイルを実行する文です.そのため、データベース構築テーブルと初期データを実行するsql文を含むBinaryファイルを2つ追加します.
<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の後、ユーザーが変更したデータベース接続列をインストールディレクトリのconfigプロファイルに保存する
2.CustomActionを追加し、インストールディレクトリにインストールされているプロファイルからデータベース接続列を読み出し、DBNAMEなどの属性の値を接続列の関連属性の値に変更する.
3、設定
ExecuteOnReinstall属性はyes
ここでは例を提供しないで、前の章の内容を理解すれば簡単に実現できるはずです.もう1つの方法は、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を使用してアップグレードパッケージとパッチを作成する方法について説明します.