如何在MSI WIX中跟踪并硬编码旧版本号以实现SQL数据库升级校验
在WIX中实现版本跟踪与SQL数据库升级校验
一、硬编码旧版本号到WIX项目
你可以通过两种方式在WIX中硬编码目标旧版本号:
1. 使用预处理器变量
在.wxs文件顶部定义预处理器变量,方便在整个项目中统一引用:
<?define PreviousDBVersion = "1.0.0.0"?> <!-- 替换为你的目标旧版本号 -->
后续在属性或自定义动作中可通过$(var.PreviousDBVersion)调用该值。
2. 使用自定义属性
在Product或Component节点下定义持久化的自定义属性,供后续校验逻辑使用:
<Property Id="PREVIOUS_DB_VERSION" Value="1.0.0.0" Secure="yes" />
二、获取LocalDB的当前Build版本
编写自定义动作(推荐用C#,也可使用VBScript)查询数据库版本:
- 如果数据库有专门存储版本的表(比如
dbo.VersionInfo),直接查询该表的版本字段; - 或通过系统函数获取:
SELECT @@VERSION(需解析提取build版本号)。
将查询到的版本号存入WIX属性,比如CURRENT_DB_BUILD_VERSION。
三、版本校验与脚本执行控制
1. 版本匹配校验逻辑
在自定义动作中比较硬编码版本与数据库当前版本,设置执行开关属性:
// C#自定义动作示例 [CustomAction] public static ActionResult CheckDBVersion(Session session) { string expectedVersion = session["PREVIOUS_DB_VERSION"]; string currentVersion = GetCurrentDBVersion(); // 自行实现查询数据库版本的方法 session["SHOULD_RUN_UPGRADE"] = expectedVersion == currentVersion ? "1" : "0"; return ActionResult.Success; }
在WIX中注册该自定义动作,确保其在SQL脚本执行前运行。
2. 条件执行SQL脚本
使用WIX的SqlExtension,给SqlScript元素添加执行条件,仅当版本匹配时执行:
<SqlDatabase Id="LocalDB" Database="YourTargetDB" Server="(LocalDB)\MSSQLLocalDB" /> <Binary Id="UpgradeScriptsSql" SourceFile="upgradeScripts.sql" /> <SqlScript Id="RunUpgradeScript" ExecuteOnInstall="yes" ExecuteOnReinstall="no" ExecuteOnUninstall="no" Condition="SHOULD_RUN_UPGRADE = '1'"> <BinaryRef Id="UpgradeScriptsSql" /> </SqlScript>
3. SQL脚本内的双重校验
为避免WIX层面判断失效,在upgradeScripts.sql开头添加硬编码版本的校验逻辑:
-- 硬编码预期的旧版本号 DECLARE @ExpectedPreviousVersion NVARCHAR(20) = '1.0.0.0'; DECLARE @CurrentDBVersion NVARCHAR(20); -- 从数据库获取当前版本(假设存储在dbo.VersionInfo表) SELECT @CurrentDBVersion = BuildVersion FROM dbo.VersionInfo; -- 版本不匹配则终止脚本 IF @CurrentDBVersion != @ExpectedPreviousVersion BEGIN PRINT '数据库版本与预期旧版本不匹配,取消升级'; RETURN; END; -- 以下是实际升级SQL语句 -- ...
四、版本跟踪补充
若后续需支持多版本升级,只需修改WIX中硬编码的版本号和SQL脚本内的预期版本即可。单脚本场景下,硬编码是最直接的实现方案。
内容的提问来源于stack exchange,提问作者Hemant kumar
相关产品推荐
相关产品推荐

