2017-09-30 3 views
12

데이터베이스가 최신 버전이 아니며 최신 버전의 응용 프로그램을 지원하지 않기 때문에 데이터베이스 마이그레이션이 실패 할 경우 ClickOnce를 사용하여 게시 한 이전 버전의 C# 응용 프로그램을 복원하려고합니다.데이터베이스 마이그레이션 실패시 이전 상태 복원 (ClickOnce)

세부

나는 인터넷을 사용할 수없는 외딴 지역에서 로컬로 사용되는 응용 프로그램을 개발하고있다. 인터넷을 통해 어딘가에 한 번씩 자신의 앱을 업데이트 한 다음 로컬 네트워크에 앱을 배포합니다. 거기에서 모든 사람들이 업데이트 된 버전의 앱을 얻을 수 있습니다. 내가 지금 원하는 것은이 응용 프로그램을 사용하여 데이터베이스 마이 그 레이션을 사용하고 응용 프로그램이 실패하면 이전 버전으로 복원해야합니다. 이미 데이터베이스 이전을 위해 FluentMigrator을 사용했으며 ClickOnce을 사용하여 앱을 배포했습니다. 나는 또한 어떻게 할 수 있는지보기 위해 여기 거의 모든 링크를 통과했다. 이제는 ClickOnce를 사용할 수 없다는 것을 알고 있습니다. 아무도 나에게 다른 방법을 말하거나 해킹 일 수 있습니까?. 나는 자동 업데이트 기능 때문에 ClickOnce를 사용하고 있으므로 지금은 그 기능을 잃고 싶지는 않습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

어떤 데이터베이스를 사용하고 있습니까? 삽입하기 위해 SQL 쿼리를 사용하고 있습니까? –

+0

SQL 서버를 사용하고 있습니다. 마이그레이션의 경우 FluentMigrator를 사용하고 있습니다. 어떻게 든 실패하면 이전 버전의 앱으로 복원하고 싶습니다. 나는 내가 제어판을 사용하여 그것을 할 수 있다는 것을 안다. 하지만 앱에서 제어하는 ​​방법은 무엇입니까? –

+0

70 upvotes에 대한 대답은 당신을 위해 작동하지 않습니다? https://stackoverflow.com/questions/199348/how-can-i-roll-back-a-clickonce-application –

답변

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 
} 
+0

Hacky하지만 작동합니다. –

1

따라서 실행 중에 문제가 발생하면 이전 버전의 앱을 실행하고 싶습니다.

ClickOnce에 대한 해결책은 모르겠지만 아날로그가 있습니다 (Squirrel). 나쁜 소식은 Squirrel에도 똑같은 해결책이 없지만 이전 버전의 앱을 phisically 저장하고 실행할 수 있으며 작동합니다 (앱에서 확인한 것입니다).

그래서 전략이있다 : 다람쥐에

  1. 마이그레이션 (그들은 그것을 위해 a tool가) 비상 사태의 경우
  2. - 저장된 이전 버전 CALC 경로 및 실행합니다. 상대 경로는 "../app-1.1.1/myApp.exe"와 같아야합니다.

그러나 염두에 두어야 할 것이 하나 있습니다. 다람쥐는 앱을 업그레이드 한 경우에만 이전 버전을 저장합니다. 처음 설치 한 후에는 이전 버전이 없습니다.

행운을 빈다.

+0

제임스가 제안한대로 클릭 한 번으로 같은 작업을 수행 할 수 있습니다. 다른 도구를 제안 해 주셔서 감사합니다. –

0

설명에서 다른 버전의 응용 프로그램은 단일 데이터베이스를 공유합니다. 응용 프로그램의 새 버전이 머신에서 실행되기 때문에 공유 데이터베이스를 패치/마이그레이션해야합니다. 실패하면 응용 프로그램이 설치되지 않습니다. 데이터베이스가 손상되지 않고 실패하기를 바랍니다.

클릭 할 수있는 이벤트가 있습니다. 아마 사용자 정의 설치 프로그램을 만듭니다.

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

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

게시 된 ClickOnce 응용 프로그램 https://msdn.microsoft.com/en-us/library/748fh114.aspx

연습 : 도움이 ClickOnce 응용 프로그램 https://msdn.microsoft.com/en-us/library/dd997001.aspx

희망에 대한 사용자 정의 설치를 작성.

+0

다른 버전의 앱이 자체 데이터베이스를 실행하고 있습니다. –