Как программно переместить базу данных SQL Server (localdb) с одной машины на другую

В соответствии с приведенным ниже справочным документом я хочу переместить базу данных SQL Server Express (localdb, созданную в vs2013).

Как переместить localdb с одной машины на другую вручную

Однако операция должна быть полностью автоматизирована из моего приложения wpf С#.

Чего я хочу добиться (обновлено):

  1. Начальная реализация приложения (в настоящее время наиболее важная) ->

    База данных должна быть установлена ​​/ скопирована на компьютер пользователя при установке приложения, в идеале база данных должна быть упакована в zip-файл или установочный файл, чтобы ее можно было легко перенести на компьютер пользователя при установке приложения, или я Я открыт для любых лучших идей?

  2. Поддержание его в актуальном состоянии -> Приложение должно иметь возможность экспортировать и импортировать данные из локальной базы данных в файл базы данных sql в локальной сетевой папке. Для этого может потребоваться объединение данных.

Будет ли это сделано с помощью кода С# или сценария sql (если сценарий, пожалуйста, сообщите, как запустить сценарий из С#). Как можно лучше добиться этого?

Заранее спасибо за помощь!


person MikeDub    schedule 18.12.2013    source источник
comment
Я не специалист по С#, поэтому не могу полностью ответить на ваш вопрос. Однако можете ли вы, если вы просто используете резервную копию, почему бы просто не использовать команду SQL для создания резервной копии, а затем переместить ее с помощью сценария C # и использовать команду SQL для ее восстановления.   -  person Zane    schedule 19.12.2013
comment
Если вы используете инфраструктуру сущностей, вы можете просто установить базу данных и все исходные данные при первом запуске приложения. После того, как EF установит базу данных, вы должны будете использовать платформу синхронизации для обновления между двумя экземплярами файлов базы данных.   -  person Charlie Brown    schedule 20.12.2013


Ответы (1)


исходя из вашего вопроса, вы пытаетесь просто перенести базу данных с одной машины на другую, верно? Вам нужно будет рассмотреть некоторые переменные, например, вам нужно создать базу данных? Как приложение будет общаться с каждой машиной? Необходимо будет рассмотреть несколько других переменных; однако маршрут, который я, скорее всего, выбрал бы, - это создать желаемый веб-сервис.

Веб-служба позволит вам решить, будете ли вы вытягивать локальную базу данных на сервер или сервер на свой локальный компьютер, или какие-либо требования, которые могут потребоваться.

Без этих требований задача усложняется. Однако, если вы подумаете о своей проблеме в меньшем масштабе, она станет совершенно ясной.

  1. Убедитесь, что первичная база данных существует
  2. Дайте команду сделать резервную копию
  3. Создать новую базу данных
  4. Убедитесь, что ваша вновь созданная база данных существует
  5. Запустите команду для восстановления резервной копии

По сути, это все, что вам нужно сделать, один класс может сделать это.

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

if(IsDatabaseInExistence(server.TemplateName) == true)
     CreateSQLDatabase(customer.WebAddress);

if(IsDatabaseInExistence(customer.WebAddress) == true)
     RestoreSQLDatabase(server.TemplateName, customer.WebAddress);

Метод, который принимает параметры, затем вызывает пару частных методов, и вы выполнили свою задачу. Однако для достижения цели попробуйте использовать parameters, если вы выдаете необработанный SqlCommand, вы можете сделать его восприимчивым к внедрению SQL.

Плохая практика:

using(SqlConnection connectionForSQL = new SqlConnection(@"Server=localhost; Integrated Security=SSPI; Database=master"))
{
     string restoreSQLDb =
           "RESTORE FILELISTONLY FROM DISK='C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\Backup\\" + templateName + ".bak'"
           + "RESTORE DATABASE [" + webAddress + "] FROM DISK='C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\Backup\\" + templateName + ".bak'"
           + "WITH " 
           + "MOVE 'Parent' TO 'C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\DATA\\" + webAddress + ".mdf',"
           + "MOVE 'Parent_log' TO 'C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\DATA\\" + webAddress + "_log.ldf',"
          + "REPLACE";

          using(SqlCommand restoreDbCommand = new SqlCommand(restoreSQLDb, connectionForSQL))
          {
               connectionForSQL.Open();
               restoreDbCommand.ExecuteNonQuery();
          }
}

Кроме того, в примере я забыл указать метод резервного копирования, но вы поняли.

Однако я думаю, что ваша проблема заключается в переносе с одной машины на другую. Я бы посмотрел на Windows Communication Foundation Services (WCF). Это должно обеспечить гибкость для связи с другой машиной и выполнения целого ряда задач.

К сожалению, у меня нет точных требований, поэтому мне действительно сложно вам помочь.

Надеюсь, это укажет вам правильное направление.

person Greg    schedule 18.12.2013
comment
Шаги 3 и 4 необязательны. SQL Server автоматически создаст БД, если вы укажете имя БД как часть команды RESTORE. Действительно, вам действительно нужно указать WITH REPLACE, чтобы перезаписать существующую БД с помощью команды. В противном случае вы должны сначала DROP DB. Я бы сказал, что было бы лучше предупредить пользователя, когда цель восстановления существует. - person Bacon Bits; 19.12.2013
comment
Подумав еще раз, я обновил то, что пытался достичь выше. Имея в виду, что нет доступных веб-серверов, только сетевая папка и компьютер пользователя. - person MikeDub; 19.12.2013
comment
@MikeDub Вы по-прежнему можете использовать WCF для локальной передачи с различными протоколами, такими как TCP. - person Greg; 19.12.2013
comment
Спасибо, я принял это как ответ, хотя это и не полное решение, оно, по крайней мере, указывает мне правильное направление. Полагаю. - person MikeDub; 20.12.2013
comment
@MikeDub У меня есть веб-сервис, который я написал для автоматизации развертывания системы управления контентом; с пользовательской базой данных, которую мы написали. За исключением того, что все это существовало на одном сервере; однако аналогичное должно применяться. Если вам нужно что-нибудь еще, не стесняйтесь спрашивать. - person Greg; 20.12.2013