0

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

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

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

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

3-设置DetectNewerInstalledVersionRemovePreviousVersiontrue

4-构建项目。

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

到那时,一切正常

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

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

8-重建安装项目。

9- 重新安装软件。

预期: Access 数据应该已使用新按钮/标签进行了更新。

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

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

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

怎么了 ?

4

2 回答 2

0

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

来自MSFT 网站

非版本化文件是用户数据 - 如果修改日期晚于计算机上文件的创建日期,请不要安装该文件,因为用户自定义设置将被删除。如果修改日期和创建日期相同,请安装该文件。如果创建日期晚于修改日期,则认为该文件未修改,请安装该文件。

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

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

2)将后端文件属性设置Permanenttrue

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

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

于 2017-05-04T14:54:52.083 回答
0

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

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

基本上,发布一个安装数据库的产品是一个坏主意,用户使用潜在的大量数据更新该数据库,只是让产品的新版本删除整个数据库。我不清楚您的应用程序如何处理更新(您是否希望添加的按钮/标签完全丢失,或者您是否以某种方式保存它们?)因此推荐解决方案很困难,但也许您需要卸载自定义删除数据库的操作,或者在升级时将更新添加到现有数据库,而不是删除它并重新开始。

于 2017-05-03T17:17:18.687 回答