微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WIX 条件 SQL 脚本执行不起作用

如何解决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 脚本。

解决方法

我找到了一种解决方法,通过为 sql 组件创建子功能并将组件条件移动到功能级别来解决此问题。而不是 InstallExecuteSequence 我在 InstallUISequence 中执行我的自定义操作。

<Feature Id="feature" Title="xxx" Description="xxx" ConfigurableDirectory="INSTALLDIR" Level="1">
    <Feature Id="feature_script" Title="script" Description="script" Display="hidden" Level="1" >
        <Condition Level="0">EXECUTE_SCRIPT = "NO"</Condition>                          
        <Condition Level="1">EXECUTE_SCRIPT = "YES"</Condition>
        <ComponentRef Id="componentSqlScript" />                
    </Feature>          
</Feature>      

<InstallUISequence>     
    <Custom Action='SetExecuteScriptCondition' Before='LaunchConditions' />
</InstallUISequence>
,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。