如何将 SQL Server 数据库备份还原到新创建的数据库?

Suk*_*nya 3 smo sql-server-2005 database-restore

我有一个名为backupdb.bak.I的 SQL Server 2005 数据库备份。我想将它恢复到数据库MyDatabase

但在恢复之前,我必须检查是否MyDatabase已经存在。如果是,那么我创建一个名为的新数据库MyDatabaseNew,并将备份文件恢复到这个新数据库。

如果我直接将文件恢复到MyDatabase. 但是当我检查是否存在MyDatabase并尝试创建名为 的新数据库时MyDatabaseNew,它给出了错误:

服务器 servername 的还原失败

我的代码如下所示:

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();
Run Code Online (Sandbox Code Playgroud)

和我的创建数据库(如果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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我哪里出错了?

Mar*_*icz 5

还原到新数据库时,您需要使用等效于Transact-SQL 的RESTORE DATABASE ... WITH MOVE ...语句来为数据和日志文件指定新名称:

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

更多信息:SQL 2005 中的 SMO 入门 - 恢复