2010-06-22 12 views
2

Mon problème est vraiment simple. J'ai un fichier .bak qui contient un ou plusieurs jeux de sauvegarde. Lorsque j'utilise SMO pour restaurer la base de données avec ce fichier .bak, seul le premier jeu de sauvegarde fonctionne. Il semble ignorer les ensembles restants.Utiliser tous les jeux de sauvegarde pour restaurer la base de données avec SMO

Pourquoi est-ce?

Voir mon code:

  //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); 

Je pensais que le BackupDeviceItem pouvait me donne une rétroaction sur le nombre de jeux de sauvegarde, il y a à l'intérieur, de cette façon, je pouvais avertir l'utilisateur, mais ce n'est pas.

Quelqu'un a une idée à ce sujet?

Merci pour votre temps.

Répondre

3

Ok, résolu mon problème.

Le champ important est FileNumber sur l'objet Restore. La valeur par défaut est 1, c'est pourquoi j'ai toujours pris mon premier jeu de sauvegarde.

Je viens de devoir définir cette propriété au nombre de jeux de sauvegarde dans le fichier et maintenant, il prend la sauvegarde la plus récente.

Remarque: Aucune sauvegarde différentielle n'est impliquée dans ce problème.

2

Je viens de découvrir que je pourrais facilement savoir combien de jeux de sauvegarde contient le fichier.

DataTable backupSets = restore.ReadBackupHeader(server); 

Maintenant, un backupSets.Rows.Count simple peut me aider à avertir l'utilisateur.

+0

Ceci est très utile, merci de poster vos résultats. Je voudrais ajouter que pour lui dire quel fichier de sauvegarde vous souhaitez lire l'en-tête de vous l'ajouter en tant que périphérique à l'objet de restauration via Restore.Devices.Add(). Exemple complet sur MSDN, http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.readbackupheader.aspx – Despertar