首页 > 解决方案 > WIX 条件 SQL 脚本执行不起作用

问题描述

我正在创建一个新的 WIX 安装程序。安装基于客户现有的数据库。在第一次安装时,我只在数据库中拥有已安装功能的信息。所以我必须从中查询这些功能,安装程序不应该执行它的激活脚本。每个功能都有一个属性,我通过自定义操作设置了这些属性,但条件 SQL 脚本执行不起作用。我创建了一个示例 wxs 源文件。你能帮我看看有什么问题吗?

<?xml version='1.0' encoding='UTF-8'?>
<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'>
        
    <!-- https://wixtoolset.org/documentation/manual/v3/xsd/wix/product.html -->
    <Product Id='BC075295-7BB8-4B82-89AC-3F81681130CC' Name='XXX' UpgradeCode='4AD0BCB8-B1BB-4FE1-ABEE-58E93321AAC5' Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='XXX'>
        <Package Id='*' Keywords='Installer' Description="XXX Installer" InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252'/> 
        <Media Id='1' Cabinet='Andoc.cab' EmbedCab='yes' />     

        <Binary Id="WixCustomActions" SourceFile="CustomAction.CA.dll" /> 
        <Binary Id="sqlScriptBinaryKey" SourceFile="insert.sql" />

        <CustomAction Id="SetExecuteScriptCondition" BinaryKey="WixCustomActions" DllEntry="SetExecuteScriptCondition" Execute="immediate" Return="check" />

        <Property Id="EXECUTE_SCRIPT" Value="NO" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="INSTALLDIR" Name="XXX" />
        </Directory>

        <Component Id="componentSqlScript" Directory="INSTALLDIR" Guid="1af938ef-6788-a0e1-2370-a6c2620c9dCC">
        
            <Condition>EXECUTE_SCRIPT = "YES"</Condition>

            <sql:SqlDatabase Id="db" Database="[DATABASE_NAME]" Server="[DATABASE_SERVER]" CreateOnInstall="yes" DropOnUninstall="no" ContinueOnError="no">
                <sql:SqlScript Id="SqlScriptId" BinaryKey="sqlScriptBinaryKey" ExecuteOnInstall="yes" ExecuteOnUninstall="no" ContinueOnError="no" />
            </sql:SqlDatabase>
            
            <CreateFolder />
        </Component>

        <Feature Id="feature" Title="xxx" Description="xxx" ConfigurableDirectory="INSTALLDIR" Level="1">
            <ComponentRef Id="componentSqlScript" />
        </Feature>

        <InstallExecuteSequence>        
            <Custom Action='SetExecuteScriptCondition' Before='InstallInitialize' />
        </InstallExecuteSequence>

        <UI>    
            <UIRef Id="WixUI_Mondo" />  
        </UI>
    </Product>
</Wix>

我的自定义操作如下所示。

[CustomAction]
public static ActionResult SetExecuteScriptCondition(Session session)
{
    session["EXECUTE_SCRIPT"] = "YES"; 
    return ActionResult.Success;
}

在日志中,我看到 EXECUTE_SCRIPT 属性值为“YES”,但未执行 insert.sql 脚本。

标签: wixwindows-installer

解决方案


InstallInitialize为时已晚,因为在成本计算期间评估了组件“componentSqlScript”的条件。这就是设置该属性似乎不起作用的原因。

您需要在“CostInitialize”之前安排您的操作,在 UI 和 Execute 序列中对其进行排序(因为 UI 序列不一定运行,并且如果在 UI 序列中也执行了成本计算,那么执行序列将太迟)。您应该添加Execute="firstSequence"到您的CustomAction元素中,并且应该添加Secure="yes"到您的Property元素中,以防止过度运行代码并防止公共属性值并不总是设置为执行序列的问题。


推荐阅读