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

3
我有一个名为backupdb.bak的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();

如果 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个回答

5

是的,我将 restore.sqlrestore(smoserver) 放在 try..catch 块中,并且这里仍然出现了相同的错误:-- - Sukanya
基础 {Microsoft.SqlServer.Management.Smo.SqlSmoObject} = {[servername]} - Sukanya
((Microsoft.SqlServer.Management.Smo.Server)(((Microsoft.SqlServer.Management.Smo.FailedOperationException)(ex1)).FailedObject)).AuditLevel - Sukanya
1
实际上,起初我试图创建一个新的数据库,并将其日志和数据文件路径分配给旧的数据库。但是那里出了问题...所以最终我简化了事情...现在我正在将数据库备份文件(.bak扩展名)还原到现有的数据库中。在还原之前,我会先备份数据库,然后将备份文件还原到现有的数据库中。现在不会创建新的数据库... - Sukanya
1
@Tyler 这个命令的想法就是——文件不应该存在,因此恢复过程可以创建这样名称的文件。但是,如果您要在不同的服务器上还原数据库并保留数据库和其文件的原始名称,则根本不需要使用RelocateFiles - Marek Grzenkowicz
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接