2012-02-23 81 views
0

我們有一個ClickOnce部署的應用程序。我們希望確保安裝只更新1版本跳轉eacn時間。 (其他最佳實踐解決方案也歡迎)。ClickOnce更新,控制版本跳轉

舉例說,一個用戶安裝了1.16版本,同時還有2個新版本,所以服務器上的版本現在是1.18。我們希望確保下次應用程序更新時,它會首先從1.16更新到1.17。然後下次更新時,它會從1.17更新到1.18等。它不會直接從1.16更新到1.18。

爲什麼,你可能會問。那麼它涉及到我們的應用程序有一個本地(SQL EXPRESS)數據庫的事實。我們有一個自定義更新類,在應用程序啓動時調用它。它檢測CO更新是否已經發生,如果是的話,它會更新本地數據庫可能已經做出的任何模式更改。即CO更新首先提供執行scehma更改所需的文件,然後自定義更新類執行實際的數據庫修改。跳過多於1個版本時,這是一個問題,因爲在這個例子中,db從v.16更改腳本到v.17永遠不會被應用。

我們的第一種方法是菊鏈式CO更新文件夾。這是從1.17更新的v.16,從1.18更新的1.17,但這似乎不能解決問題。

任何想法?

回答

1

我有一個強大的ClickOnce應用程序,它也可以在最終用戶的PC上使用SQL Server Express。在我們的例子中,本地數據庫模式的同步在我們的Web服務器上進行管理。

應用程序啓動後,將從當前客戶端數據庫中取出版本信息(如果數據庫不存在,則返回版本「0」),然後Web服務返回必需的腳本文件以構建本地數據庫。然後,ClickOnce應用程序按順序執行腳本,並且完美地構建數據庫模式,無論上次是何時用戶啓動應用程序。

本地模式更新後,用戶需要訪問的任何數據都將從服務器重新同步。這是因爲每次我更新數據表時,我都必須刪除表,然後從我的模式更新腳本中重新創建它們。

如果您不想管理這種類型的複雜服務器/客戶端腳本/數據庫管理系統,爲什麼不能將相關的SQL腳本與您的應用程序捆綁在一起?您可以通過在您的客戶端數據庫中定義維護當前數據庫版本的表來實現此目的。當用戶將新更新下載到您的應用程序時,請檢查數據庫的版本,並根據客戶端當前的數據庫版本,執行您使用應用程序編譯的可用腳本或命令。

只爲應用程序的每個後續發佈添加腳本,並且永遠不要刪除舊腳本。新的SQL腳本應該刪除並重新創建任何正在更新的對象。如果您的應用程序碰巧在您的應用程序正在執行的腳本的中間發生崩潰,這可以爲您節省不少麻煩。我很難學會這一點。

我會建議創建一個同步機制,從您的服務器管理版本檢查,而不是使用腳本或嵌入SQL命令編譯您的應用程序。這樣,可以在不必發佈應用程序的情況下對數據庫進行輕微更改。請相信我,您的用戶將會感謝您,因爲他們無需下載頻繁的應用程序更新。相反,這些類型的更改將是無縫的,並將在幕後自動進行。

1

我正在粘貼一個方法,我用它來查找程序的版本(如果它是從桌面啓動的)以及從ClickOnce啓動的更新版本。

private string GetTheVersion() 
    { 
     string version = string.Empty; 
     Version currentVersion; 
     Version updateVersion; 
     StringBuilder sb = new StringBuilder(); 
     if (ApplicationDeployment.IsNetworkDeployed) 
     { 
       currentVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion; 
      updateVersion = ApplicationDeployment.CurrentDeployment.UpdatedVersion; 

      sb.AppendLine(string.Format("Current Version: {0}.{1}.{2}.{3}", currentVersion.Major.ToString(), currentVersion.Minor.ToString(), currentVersion.MajorRevision.ToString(), currentVersion.MinorRevision.ToString())); 
      sb.AppendLine(string.Format("Updated Version: {0}.{1}.{2}.{3}", updateVersion.Major.ToString(), updateVersion.Minor.ToString(), updateVersion.MajorRevision.ToString(), updateVersion.MinorRevision.ToString())); 
      version = sb.ToString(); 
     } 
     else 
     { 
      currentVersion = Assembly.GetCallingAssembly().GetName().Version; 
      version = string.Format("Current Version: {0}.{1}.{2}.{3}", currentVersion.Major.ToString(), currentVersion.Minor.ToString(), currentVersion.MajorRevision.ToString(), currentVersion.MinorRevision.ToString()); 
     } 

     return version; 
    } 

有更多的有比你需要的,當然,但你可以使用ApplicationDeployment.CurrentDeployment類的方法,以確定是否要進行更新。您可以將現有應用的最低版本傳遞到命令行參數或url querystring變量中,具體取決於您的部署方式。

Joey