【问题标题】:Restore Previous State of app on database migration failure (ClickOnce)在数据库迁移失败时恢复应用程序的先前状态 (ClickOnce)
【发布时间】:2018-03-12 05:41:54
【问题描述】:

如果数据库迁移失败,我想恢复使用 ClickOnce 发布的以前版本的 C# 应用程序,因为数据库不是最新的并且它不支持最新版本的应用程序。

详情

我正在开发一个应用程序,该应用程序将在无法上网的偏远地区本地使用。一个人会每隔一段时间通过某种方式上网来更新他/她的应用程序,然后将应用程序部署在本地网络上。从那里每个人都将能够获得应用程序的更新版本。我现在想要的是使用这个应用程序使用数据库迁移,如果应用程序失败它应该恢复到以前的版本。我已经使用 FluentMigrator 进行数据库迁移,并使用 ClickOnce 来部署应用程序。我也浏览了这里的几乎所有链接,看看我该怎么做。我现在知道使用 ClickOnce 是不可能的。谁能告诉我其他方式或者可能是某种黑客?我使用 ClickOnce 是因为它具有自动更新功能,所以现在不想失去该功能。任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是哪个数据库?是否使用 SQL 查询插入?
  • 我正在使用 Sql 服务器。对于迁移,我使用的是 FluentMigrator。如果以某种方式失败,我想恢复到应用程序的先前版本。我知道我可以使用控制面板来做到这一点。但是如何从应用程序控制它?
  • 70 票赞成的答案对您不起作用? stackoverflow.com/questions/199348/…
  • @GeorgeVovos 我没有相同的场景,因为不同的用户可以使用不同的版本。
  • 我认为您尝试解决需要在不同层面上解决的问题。如果您的更新失败,则需要进行更多测试。如果偏远地区是公司网络,他们的 IT 需要在推出之前确保质量。

标签: c# clickonce


【解决方案1】:

FluentMigrator 跟踪数据库中的当前版本。它还跟踪当前应用程序版本中的最新版本。运行 Migrator 函数,检查当前版本中最新版本的 Migration 文件是否等于存储在数据库中的最新版本。如果两者相等,则迁移成功。如果它们不相等,则可以运行 cmd 命令直接打开控制面板的(删除或备份)窗口并转到以前的版本。这是使用 ClickOnce 恢复到以前版本的最佳方法。

try {
     new MigrationsWrapper(AppManager.ConnectionString).MigrateToLatestVersion();
}
catch (Exception ex) 
{

}
LatestVersionNumber = new MigrationsWrapper(AppManager.ConnectionStringADO).LatestVersionNumber;
CurrentVersionNumber = new MigrationsWrapper(AppManager.ConnectionStringADO).CurrentVersionNumber;
if (LatestVersionNumber > CurrentVersionNumber) {

 string applicationName = ConfigurationManager.AppSettings["ApplicationName"].ToString();
 string uninstallString = GetUninstallRegistryKeyByProductName(applicationName);
 if (uninstallString != string.Empty) {
      System.Diagnostics.Process process = new System.Diagnostics.Process();
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
      startInfo.FileName = "cmd.exe";
      startInfo.Arguments = "/c " + uninstallString;
      process.StartInfo = startInfo;
      process.Start();

 }
} else {
 // Successfull
}

【讨论】:

    【解决方案2】:

    根据描述,应用程序的不同版本共享一个数据库。随着应用程序的新版本在机器上上线,它需要修补/迁移共享数据库。如果失败,则不会安装应用程序。让我们希望它在不损坏数据库的情况下失败。

    有可以挂钩的 clickonce 事件。可能创建一个自定义安装程序。

    https://msdn.microsoft.com/en-us/library/system.deployment.application.applicationdeployment_events.aspx

    https://msdn.microsoft.com/en-us/library/system.deployment.application.applicationdeployment.aspx

    发布 ClickOnce 应用程序 https://msdn.microsoft.com/en-us/library/748fh114.aspx

    演练:为 ClickOnce 应用程序创建自定义安装程序 https://msdn.microsoft.com/en-us/library/dd997001.aspx

    希望对您有所帮助。

    【讨论】:

    • 不同版本的应用运行自己的数据库。
    【解决方案3】:

    因此,如果在执行过程中出现问题,您希望运行以前版本的应用程序。

    我不知道 ClickOnce 的解决方案,但有类似的方法 - Squirrel。 坏消息是 Squirrel 也没有直接的解决方案,但它以物理方式存储了以前版本的应用程序,你可以运行它并且它可以工作(我刚刚在我的应用程序上检查了它)。

    所以,有一个策略:

    1. 迁移到松鼠(他们有a tool
    2. 在紧急情况下 - 计算存储的先前版本的路径并运行它。相对路径应类似于“../app-1.1.1/myApp.exe”

    但是要记住一件事。 Squirrel 仅在从以前的版本升级应用程序时才会存储以前的版本。首次安装后没有prev版本。

    祝你好运。

    【讨论】:

    • 正如詹姆斯建议的那样,使用单击一次也可以完成相同的操作。仍然感谢您推荐其他工具。
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多