在数据库迁移失败时还原应用的上一个状态 (ClickOnce)

Restore Previous State of app on database migration failure (ClickOnce)

提问人:Safi Mustafa 提问时间:9/30/2017 最后编辑:Safi Mustafa 更新时间:10/13/2017 访问量:322

问:

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

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

C# 单击一次

评论

0赞 Ubiquitous Developers 10/6/2017
您使用的是哪个数据库?您是否使用 SQL 查询进行插入?
0赞 Safi Mustafa 10/6/2017
我正在使用 Sql Server。对于迁移,我正在使用 FluentMigrator。如果以某种方式失败,我想恢复到应用程序的先前版本。我知道我可以使用控制面板来做到这一点。但是如何从应用程序控制它呢?
0赞 George Vovos 10/6/2017
70 个赞成票的答案对你不起作用?stackoverflow.com/questions/199348/......
0赞 Safi Mustafa 10/8/2017
@GeorgeVovos我没有相同的场景,因为不同的用户可能在不同的版本上。
0赞 grek40 10/11/2017
我认为你试图解决一个需要在不同层面上解决的问题。如果更新失败,则需要进行更多测试。如果偏远地区是公司网络,则其 IT 部门需要在部署前确保质量。

答:

1赞 Alexus1024 10/11/2017 #1

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

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

所以,有一个策略:

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

但有一件事要记住。松鼠仅在从中升级应用程序时才存储以前的版本。首次安装后没有上一个版本。

祝你好运。

评论

0赞 Safi Mustafa 10/13/2017
正如James建议的那样,使用单击一次也可以完成相同的操作。仍然感谢您推荐另一个工具。
0赞 null 10/12/2017 #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

希望对您有所帮助。

评论

0赞 Safi Mustafa 10/13/2017
不同版本的应用正在运行自己的数据库。
1赞 Mushahid Hussain 10/13/2017 #3

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
}