2010-06-22 53 views
2

我的问题非常简单。 我有一个包含一个或多个备份集的.bak文件。使用所有备份集与SMO恢复数据库

当我使用SMO使用该.bak文件恢复数据库时,它只需要第一个备份集来完成它的工作。它似乎忽略了其余的集合。

这是为什么?

见我的代码:

  //Sets the restore configuration 
      Restore restore = new Restore() 
      { 
       Action = RestoreActionType.Database, 
       Database = _databaseToRestore.DatabaseName, 
       ReplaceDatabase = true 
      }; 

      restore.Devices.Add(new BackupDeviceItem(_backupFilePath, DeviceType.File)); 

      Server server = new Server(_databaseToRestore.ServerName); 

      DataTable fileList = restore.ReadFileList(server); 
      string serverDataFolder = server.Settings.DefaultFile; 

      if (string.IsNullOrEmpty(serverDataFolder)) 
       serverDataFolder = server.Information.MasterDBPath; 

      foreach (DataRow file in fileList.Rows) 
      { 
       restore.RelocateFiles.Add(
        new RelocateFile((string)file["LogicalName"], 
        Path.Combine(serverDataFolder, _databaseToRestore.DatabaseName + Path.GetExtension((string)file["PhysicalName"])))); 
      } 

      //Gets the exclusive access to database 
      server.KillAllProcesses(_databaseToRestore.DatabaseName); 
      restore.Wait(); 

      restore.SqlRestore(server); 

我认为BackupDeviceItem能带给我多少备份集里面有,这样,我可以警告用户反馈,但事实并非如此。

任何人都有这方面的线索?

谢谢你的时间。

回答

3

好的,解决了我的问题。

重要的字段是FileNumberRestore对象。 默认值是1,所以这就是为什么它总是使用我的第一个备份集。

我只需将此属性设置为文件中备份集的数量,现在需要完成最新的备份。

注意:没有差异备份涉及此问题。

2

我刚发现我可以很容易地知道该文件包含多少备份集。

DataTable backupSets = restore.ReadBackupHeader(server); 

现在,一个简单的backupSets.Rows.Count可以帮助我警告用户。

+0

这非常有用,感谢您发布您的发现。我想补充说明,通过Restore.Devices.Add()将它作为设备添加到还原对象,告诉它哪个备份文件要读取您的标题。 MSDN上的完整示例,http://msdn.microsoft.com/zh-cn/library/microsoft.sqlserver.management.smo.restore.readbackupheader.aspx – Despertar 2012-04-09 04:28:23