【问题标题】:VS2015 Setup Project not updating Access Database included in package when reinstallingVS2015安装项目在重新安装时不更新包中包含的Access数据库
【发布时间】:2017-05-02 18:00:29
【问题描述】:

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

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

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

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

3- 将 DetectNewerInstalledVersionRemovePreviousVersion 设置为 true

4- 构建项目。

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

到目前为止,一切正常

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

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

8- 重建安装项目。

9- 重新安装软件。

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

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

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

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

怎么了?

【问题讨论】:

    标签: visual-studio ms-access visual-studio-2015 setup-project visual-studio-setup-proje


    【解决方案1】:

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

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

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

    【讨论】:

    • 在我们的例子中,我们为主应用程序提供了两个 Access 数据库。第一个用作前端,第二个用作包含数据的所有表的后端。因此,前端(表单)中的对象所做的所有调用都链接到后端的表格。后端永远不会改变,所以我将此文件设置为永久文件。前端会发生变化,这就是为什么我需要这个文件能够被替换。
    • 我找到了解决方案:在帖子中查看我的答案。
    【解决方案2】:

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

    来自MSFT site

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

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

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

    2) 设置后端文件属性Permanenttrue

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

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

    【讨论】:

    • 1) 修改后的数据解释在我的回答中 - 我不清楚您为什么没有看到或者我没有说清楚。 2) REINSTALLMODE =amus 是个坏主意 - 它会用旧文件替换系统上的所有文件(比你的版本更高)。 3) 永久的意思是永久的。即使您在设置中设置了永久错误,该文件也将始终保留。你会像这样黑客攻击stackoverflow.com/questions/42284519/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多