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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-