我正在尝试构建一个部署多个C#项目和一些其他文件的Visual Studio安装程序安装项目。这些其他文件中包含Access数据库,其中包含需要更新的表单。
为了说明问题,我简化了它:
1-创建一个新的Access数据库文件,使用按钮和标签为其添加一个简单的表单并保存。
2-将文件添加到安装项目中;
3-将DetectNewerInstalledVersion
和RemovePreviousVersion
设为true
4-构建项目。
5-运行安装程序可执行文件。
到目前为止,一切正常
6-重新打开Access数据库文件,向表单添加按钮或标签,保存。
7-更改安装项目的Version
号码,同时更改VS2015建议的ProductCode
。
8-重建安装项目。
9-重新安装软件。
预期:应使用新按钮/标签更新Access数据。
发生了什么:该文件尚未更新。
为什么?我见过人们谈论安装项目中包含的程序集版本数量,但这不是我的情况,因为我没有部署项目的输出。我只是部署一个应该在卸载过程中删除的文件。
如果我执行与前面描述的完全相同的步骤,但是使用我添加文本的文本文件,它可以正常工作,但出于某种原因无法使用Access数据库。
怎么了?
答案 0 :(得分:0)
如果您安装了一个数据文件,然后运行一个更新它的程序,那么您已将用户数据添加到该文件或数据库中。文件覆盖规则不允许在VS设置执行的更新中替换已修改的数据文件:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx
基本上,运送安装了用户使用潜在大量数据更新的数据库的产品是一个坏主意,只是让新版本的产品删除整个数据库。我不清楚你的应用程序如何处理更新(你想要添加的按钮/标签是完全丢失,还是以某种方式保存它们?)因此推荐解决方案很困难,但也许你需要卸载自定义操作才能删除数据库,或者在升级时将更新添加到现有数据库,而不是将其删除并重新启动。
答案 1 :(得分:0)
我找到了解决方案。该文件未更新,因为修改日期已更改。
来自MSFT site:
非版权化文件是用户数据 - 如果修改日期晚于 在计算机上创建文件的日期,不要安装该文件 因为用户自定义将被删除。如果修改和 创建日期是相同的,安装文件。如果创建日期是 在修改日期之后,该文件被视为未修改, 安装文件。
由于我有两个Access数据库(带有表单的前端,带有数据表的后端)并且只需要更新一个(表单所在的前端),这里是解决方法:
1)将REINSTALLMODE属性更改为amus
而不是默认omus
。它将强制重新安装所有文件。为此,我使用了PostBuildEvent
as explained here。
2)将后端文件属性Permanent
设置为true
3)添加Launch Condition
:Search Target Machine
以检查计算机上是否存在后端文件。将其命名为BACKENDEXISTS
4)将Condition
值添加到File System
视图中的后端文件,以便仅在Launch Condition
找不到文件时才安装该文件。在这种情况下,它将是not BACKENDEXISTS
。如果这是第一次安装,它将安装该文件,因为它尚未找到。如果这是更新,它将找到该文件,因为Permanent
属性并且不会替换它。