Как восстановить резервную копию базы данных SQL Server во вновь созданную базу данных? - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть резервная копия базы данных SQL Server 2005 с именем backupdb.bak. Я хочу восстановить ее в базе данных MyDatabase.

Но перед восстановлением я должен проверить, существует ли MyDatabase или нет. Если это произойдет, я создаю новую базу данных с именем MyDatabaseNew и восстанавливаю файл резервной копии в этой новой базе данных.

Если я напрямую восстанавливаю файл в MyDatabase, процесс работает нормально. Но когда я проверяю существование MyDatabase и пытаюсь создать новую базу данных с именем MyDatabaseNew, выдается ошибка:

Не удалось восстановить серверное имя сервера

Мой код выглядит так:

Restore restore = new Restore();
restore.Action = RestoreActionType.Database;
CreateDatabase(MyDatabaseNew);
restore.Database = MyDatabaseNew;
restore.ReplaceDatabase = true;

BackupDeviceItem deviceItem = new BackupDeviceItem("C:\\backupdb.bak",DeviceType.File);
restore.Devices.Add(deviceItem);
SqlConnection sqlCon = new SqlConnection("Data Source=.;Initial Catalog=MyDatabaseNewIntegrated Security=True;User ID=uid; Pwd=Pwd");
ServerConnection connection = new ServerConnection(sqlCon);
sqlCon.Open();

Microsoft.SqlServer.Management.Smo.Server smoServer = new Server(new  ServerConnection("."));
if (File.Exists("C:\\backupdb.bak"))
    // restore
    restore.SqlRestore(smoServer);
if (sqlCon.State == ConnectionState.Open)
    sqlCon.Close();

и мой код создания базы данных (в случае MyDatabase) выглядит так, где я передаю MyDatabaseNew в качестве параметра для этого метода:

public void CreateDatabase(string NewDBName)
{
  string str;
  SqlConnection myConn = new SqlConnection("Server=.;Integrated  security=True;
  database=master;User ID=uid;Password=Pwd");

  str = "CREATE DATABASE " + NewDBName + "";
  SqlCommand myCommand = new SqlCommand(str, myConn);
  try
  {
    myConn.Open();
    myCommand.ExecuteNonQuery();
    MessageBox.Show("New DataBase is Created Successfully", "Database Creation",
    MessageBoxButtons.OK, MessageBoxIcon.Information);
  }
  catch (System.Exception ex)
  {
    MessageBox.Show(ex.ToString(), "Database Creation", MessageBoxButtons.OK,
    MessageBoxIcon.Information);
  }
  finally
  {
    if (myConn.State == ConnectionState.Open)
    {
      myConn.Close();
    }
  }
}

Может кто-нибудь сказать мне, где я иду не так?

1 Ответ

4 голосов
/ 21 ноября 2011

При восстановлении в новую базу данных вам необходимо использовать эквивалент оператора RESTORE DATABASE ... WITH MOVE ... Transact-SQL , чтобы указать новые имена для файлов данных и журналов:

restore.RelocateFiles.Add(new RelocateFile("MyDatabase", @"c:\MyDatabaseNew.mdf"));
restore.RelocateFiles.Add(new RelocateFile("MyDatabase_Log", @"c:\MyDatabaseNew.ldf"));

Дополнительная информация: Начало работы с SMO в SQL 2005 - восстанавливает

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