2013-12-18 3 views
2

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

How to move a localdb from one machine to another manually

Однако операция должна быть полностью автоматизирована из моей МОФ C# приложение.

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

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

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

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

ли это сделать с помощью C# кода или SQL-скрипт (если скрипт, пожалуйста, посоветуйте, как запустить скрипт из C#) Как можно лучше этого достичь?

Спасибо за вашу помощь заранее!

+0

Я не парень C#, поэтому я не могу полностью ответить на ваш вопрос. Однако, если вы просто используете резервную копию, почему бы просто не использовать команду SQL для создания резервной копии, а затем переместить ее с помощью сценария C# и использовать команду SQL для ее восстановления. – Zane

+0

Если вы используете инфраструктуру сущности, вы можете просто создать инфраструктуру сущности, устанавливающую базу данных, и все исходные данные, когда приложение будет запущено. После того, как EF установит базу данных, вы затем будете использовать инфраструктуру Sync для обновления между двумя экземплярами файлов базы данных. –

ответ

1

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

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

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

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

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

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

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

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

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

Bad Practice:

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

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

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

+0

Шаг 3 и 4 не нужны. SQL Server автоматически создаст БД, когда вы укажете имя БД в составе команды «RESTORE». Действительно, вам действительно нужно указать 'WITH REPLACE', чтобы перезаписать существующую БД командой. В противном случае вы должны «DROP» в БД. Я бы сказал, что лучше было бы предупредить пользователя, когда существует цель восстановления. –

+0

После того, как я подумал, я обновил то, что я пытаюсь достичь выше. Помня о том, что нет доступных веб-серверов, просто общий сетевой файл и пользовательский компьютер. – MikeDub

+0

@MikeDub Вы по-прежнему можете использовать * WCF * для передачи локально с помощью различных протоколов, таких как TCP. – Greg

Смежные вопросы