Щракнете Веднъж върху актуализацията, контролирайки скоковете на версията

Имаме внедрено приложение ClickOnce. Бихме искали да се уверим, че инсталациите актуализират само 1 версия за всеки път. (Други решения с най-добри практики също са добре дошли).

Да кажем например, че потребител има инсталирана версия 1.16, междувременно има 2 нови версии, така че версията на сървъра вече е 1.18. Бихме искали да гарантираме, че следващия път, когато приложението се актуализира, то първо се актуализира от 1.16 на 1.17. След това следващия път, когато се актуализира, се актуализира от 1.17 на 1.18 и т.н. Т.е. не се актуализира директно от 1.16 на 1.18.

Защо, може да попитате. Ами това е свързано с факта, че нашето приложение има локална (SQL EXPRESS) база данни. Имаме персонализиран клас за актуализиране, който се извиква при стартиране на приложението. Той открива дали е настъпила актуализация на CO, ако е така, актуализира локалната база данни с всички промени в схемата, които може да са направени. т.е. актуализацията на CO първо доставя файловете, необходими за извършване на промените на scehma, а след това персонализираният клас за актуализация извършва действителната модификация на db. Това е проблем при прескачане на повече от 1 версия, тъй като в този пример скриптът за промени в db от v.16 на v.17 никога няма да бъде приложен.

Първият ни подход беше към папки за актуализиране на CO с последователна верига. Това е v.16 актуализации от 1.17, 1.17 актуализации от 1.18, но това не изглежда да реши проблема.

Някакви идеи?


person sreddy    schedule 23.02.2012    source източник


Отговори (2)


Имам стабилно приложение ClickOnce, което също използва SQL Server Express на компютъра на крайния потребител. В нашия случай синхронизирането на схемата на локалната база данни се управлява от нашия уеб сървър.

След като приложението стартира, информацията за версията се изтегля от текущата клиентска база данни (с връщана версия „0“, ако DB не съществува) и след това уеб услуга връща необходимите скриптови файлове за изграждане на локалната база данни. След това приложението ClickOnce изпълнява скриптовете в последователен ред и схемата на базата данни се изгражда перфектно, независимо кога за последен път потребителят е стартирал приложението.

След като локалната схема бъде актуализирана, всички данни, до които потребителят трябва да има достъп, се синхронизират повторно от сървъра. Това е така, защото всеки път, когато актуализирам таблица с данни, трябва да ОТПУСКАМ таблицата и след това да ги създам отново от моите скриптове за актуализиране на схема.

Ако предпочитате да не управлявате този тип сложна система за управление на сървър/клиентски скрипт/db, защо не можете да обедините свързаните SQL скриптове с вашето приложение? Можете да постигнете това, като дефинирате таблица във вашата клиентска DB, която поддържа текущата версия на DB. Когато вашият потребител изтегли нова актуализация на вашето приложение, проверете версията на DB и, в зависимост от текущата версия на DB на клиента, изпълнете наличните скриптове или команди, които сте компилирали с вашето приложение.

Добавяйте скриптове само към всяка следваща публикация на вашето приложение и никога не премахвайте старите. Новите SQL скриптове трябва да ОТПУСКАТ и да създават отново всеки обект, който се актуализира. Това може да ви спести доста главоболия, ако приложението ви се срине по време на скрипт, който се изпълнява от приложението ви. Научих това по трудния начин.

Бих препоръчал да създадете механизъм за синхронизиране, при който проверките на версиите се управляват от вашия сървър, вместо да имате скриптове или вградени SQL команди, компилирани с вашето приложение. По този начин могат да се правят незначителни промени в базата данни, без да се налага да публикувате вашето приложение. Повярвайте ми, вашите потребители ще ви благодарят, защото няма да им се налага да изтеглят чести актуализации на приложения. Вместо това, тези видове промени ще бъдат безпроблемни и ще се извършват автоматично зад кулисите.

person RLH    schedule 23.02.2012

Поставям метод, който използвам, за да намеря версията на програмата, ако е стартирана от работния плот, и версията на актуализацията, ако е стартирана от 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 заявка, в зависимост от това как внедрявате.

Джоуи

person Joseph Morgan    schedule 09.02.2016