Обновление ClickOnce, управляющее скачками версий - PullRequest
0 голосов
/ 23 февраля 2012

У нас есть развернутое приложение ClickOnce.Мы хотели бы убедиться, что установки обновляют только 1 версию в любое время.(Также приветствуются другие передовые решения).

Скажем, например, у пользователя установлена ​​версия 1.16, в то время как было выпущено 2 новых выпуска, поэтому версия на сервере теперь 1.18.Мы хотели бы убедиться, что в следующий раз приложение обновится, оно сначала обновится с 1.16 до 1.17.Затем в следующий раз он обновляется с 1.17 до 1.18 и т. Д. То есть он не обновляется напрямую с 1.16 до 1.18.

Почему, спросите вы.Ну, это связано с тем, что наше приложение имеет локальную (SQL EXPRESS) базу данных.У нас есть специальный класс обновлений, который вызывается при запуске приложения.Он обнаруживает, произошло ли обновление CO, и в этом случае обновляет локальную базу данных с любыми изменениями схемы, которые могли быть сделаны.Т.е. обновление СО сначала доставляет файлы, необходимые для выполнения изменений схемы, а затем пользовательский класс обновления выполняет фактическую модификацию БД.Это проблема при переходе более чем на 1 версию, так как в этом примере сценарий изменения базы данных с v.16 на v.17 никогда не будет применен.

Наш первый подход состоял в том, чтобы каталоги обновления CO в гирляндной цепочке.То есть обновления v.16 от 1.17, обновления 1.17 от 1.18, но, похоже, это не решает проблему.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 10 февраля 2016

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

Joey

1 голос
/ 23 февраля 2012

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

После запуска приложения информация о версии извлекается из текущей клиентской базы данных (с версией «0», возвращаемой, если БДне существует), а затем веб-служба возвращает необходимые файлы сценариев для создания локальной базы данных.Затем приложение ClickOnce выполняет сценарии в последовательном порядке, и схема базы данных создается идеально, независимо от того, когда в последний раз пользователь запускал приложение.

После обновления локальной схемы любые данные, которыепользователю необходим доступ для повторной синхронизации с сервера.Это связано с тем, что каждый раз, когда я обновляю таблицу данных, мне приходится УБРАТЬ таблицу, а затем заново создавать ее из сценариев обновления схемы.

Если вы не хотите управлять сложным сценарием сервера / клиента / db этого типаСистема управления, почему вы не можете связать связанные сценарии SQL с вашим приложением?Это можно сделать, определив таблицу в клиентской БД, которая поддерживает текущую версию БД.Когда ваш пользователь загружает новое обновление в ваше приложение, проверьте версию БД и, в зависимости от текущей версии БД клиента, выполните доступные сценарии или команды, скомпилированные с вашим приложением.

Добавляйте только скрипты в каждую последующую публикацию вашего приложения и никогда не удаляйте старые.Новые сценарии SQL должны удалять и воссоздавать любой объект, который обновляется.Это может избавить вас от нескольких головных болей, если ваше приложение аварийно завершится в середине выполнения скрипта вашим приложением.Я усвоил этот трудный путь.

Я бы порекомендовал создать механизм синхронизации, при котором проверки версий будут управляться с вашего сервера, вместо того, чтобы иметь скрипты или встроенные команды SQL, скомпилированные с вашим приложением.Таким образом, незначительные изменения в базе данных могут быть сделаны без публикации вашего приложения.Поверьте мне, ваш пользователь поблагодарит вас за то, что ему не придется загружать частые обновления приложений.Вместо этого эти типы изменений будут плавными и будут происходить автоматически за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...