2010-06-22 91 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