VS2015 安装项目在重新安装时不更新包中包含的 Access 数据库

VS2015 Setup Project not updating Access Database included in package when reinstalling

我正在尝试构建一个 Visual Studio 安装程序安装项目,用于部署多个 C# 项目和一些其他文件。包含在这些其他文件中的是带有需要更新的表单的 Access 数据库。

为了说明问题,我简化了它:

1- 创建一个新的 Access 数据库文件,添加一个带有按钮和标签的简单表单并保存。

2-将文件添加到安装项目中;

3- 将 DetectNewerInstalledVersionRemovePreviousVersion 设置为 true

4- 构建项目。

5- 运行 安装程序可执行文件。

至此,一切正常

6- 重新打开 Access 数据库文件,向表单添加按钮或标签,保存。

7- 更改安装项目的Version编号,同时按照VS2015的建议更改ProductCode

8- 重建安装项目。

9- 重新安装软件。

预期: Access 数据应该已经用新的 button/label 更新了。

发生了什么:文件尚未更新。

这是为什么?我见过人们谈论安装项目中包含的项目的程序集版本号,但我的情况并非如此,因为我没有部署项目的输出。我只是部署了一个本应在卸载过程中删除的文件。

如果我执行与之前描述的完全相同的步骤,但使用添加文本的文本文件,它工作正常,但由于某些原因不适用于 Access 数据库。

怎么了?

如果您安装了一个数据文件,然后 运行 一个更新它的程序,您就已经将用户数据添加到该文件或数据库中。文件覆盖规则不允许在 VS 设置执行的那种更新中替换修改后的数据文件:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx

从根本上说,发布安装了数据库的产品是一个坏主意,用户可能会使用大量数据更新该数据库,而只是让新版本的产品删除整个数据库。我不清楚你的应用程序如何处理更新(你想让添加的 button/label 完全丢失,还是以某种方式保存它们?)所以推荐一个解决方案很困难,但也许你需要一个卸载自定义操作以删除数据库,或者在升级时将更新添加到现有数据库而不是删除它并重新开始。

我找到了解决办法。该文件未更新,因为修改日期已更改。

来自 MSFT site:

Nonversioned Files are User Data—If the Modified date is later than the Create date for the file on the computer, do not install the file because user customizations would be deleted. If the Modified and Create dates are the same, install the file. If the Create date is later than the Modified date, the file is considered unmodified, install the file.

因为我有两个 Access 数据库(前端有表单,后端有数据表)并且只需要更新一个(前端有表单),解决方法如下:

1) 将 REINSTALLMODE 属性 更改为 amus 而不是默认值 omus。它将强制重新安装所有文件。为此,我使用了 PostBuildEvent as explained here.

2) 设置后端文件 属性 Permanenttrue

3) 添加一个Launch Condition: Search Target Machine 来检查计算机上是否存在后端文件。将其命名为 BACKENDEXISTS

4) 在 File System 视图中向后端文件添加一个 Condition 值,以便仅在 Launch Condition 未找到该文件时安装该文件。在这种情况下,它将是 not BACKENDEXISTS。如果这是第一次安装,它将安装该文件,因为尚未找到它。如果这是一个更新,它会找到文件,因为 Permanent 属性 而不会替换它。