2012-02-23 19 views
0

ClickOnceデプロイされたアプリケーションがあります。私たちはインストールが1バージョンのeacn時間を更新することを確認したい。 (他のベストプラクティスのソリューションも同様に歓迎されています)。ClickOnce更新、バージョンジャンプの制御

例えば、ユーザーにはバージョン1.16がインストールされていますが、サーバー上のバージョンは1.18になりました。次回アプリケーションがアップデートされたときには、最初に1.16から1.17に更新されていることを確認したいと思います。次に更新すると、1.17から1.18などに更新されます。 1.16から1.18に直接更新されることはありません。

なぜ、あなたが質問するかもしれません。それは、アプリケーションにローカル(SQL EXPRESS)データベースがあるという事実に関係しています。アプリケーションの起動時に呼び出されるカスタム更新クラスがあります。 CO更新が発生したかどうかを検出し、そうであればスキーマの変更によってローカルdbを更新します。私。 CO更新は、まず、シグマ変更を実行するために必要なファイルを配信し、その後、カスタム更新クラスが実際のDB変更を実行する。この例では、v.16からv.17へのdb変更スクリプトは適用されないため、これは1つ以上のバージョンをジャンプするときの問題です。

私たちの最初のアプローチは、CO更新フォルダをデイジーチェーンすることでした。 1.18からの1.17、1.17アップデートからのv.16アップデートですが、これは問題を解決するようには見えません。

アイデア?

答えて

1

私は、エンドユーザーのPCでSQL Server Expressも使用する堅牢なClickOnceアプリケーションを使用しています。私たちの場合、ローカルデータベーススキーマの同期は、Webサーバー上で管理されます。

アプリケーションが起動すると、現在のクライアントデータベースからバージョン情報が取得され(DBが存在しない場合はバージョンが "0"になります)、Webサービスが必要なスクリプトファイルを返してローカルを構築しますデータベース。 ClickOnceアプリケーションは、最後にユーザーがアプリケーションを起動したときに関係なく、スクリプトを順番に実行し、データベーススキーマは完全に構築されます。

ローカルスキーマが更新された後、ユーザーがアクセスする必要があるすべてのデータがサーバーから再同期されます。これは、データテーブルを更新するたびに、テーブルを削除してから、スキーマ更新スクリプト内からテーブルを再作成する必要があるためです。

あなたはかなり複雑なサーバ/クライアントスクリプト/ DB管理システムのこのタイプを管理していないだろう場合は、なぜあなたはあなたのアプリケーションに関連付けられているSQLスクリプトをバンドルすることはできませんか?現在のDBバージョンを維持するクライアントDB内にテーブルを定義することで、これを達成できます。ユーザーがアプリケーションに新しい更新をダウンロードするときは、DBのバージョンをチェックし、クライアントの現在のDBバージョンに応じて、アプリケーションでコンパイルしたスクリプトまたはコマンドを実行します。

アプリケーションの後続の各パブリケーションにスクリプトを追加し、古いものを削除しないでください。新しいSQLスクリプトは、更新中のオブジェクトをDROPして再作成する必要があります。アプリケーションによってスクリプトが実行されている途中でアプリケーションがクラッシュした場合、これはかなりの頭痛を軽減します。私はこれを難しい方法で学んだ。

は私の代わりに、スクリプトを持ったり、アプリケーションでコンパイルされた組み込み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変数に渡すことができます。

ジョーイ

関連する問題