2011-09-19 16 views
0

J'insère une section Sauvegarde et récupération de base de données SQL dans mon programme. J'ai utilisé des exemples de MSDN (a essayé un autre et cela ne fonctionnerait pas). MSDN Page - http://msdn.microsoft.com/en-us/library/ms162133.aspxC# Récupération de la base de données bloquée dans 'Restauration ...'

Le fichier de sauvegarde fonctionne et j'ai testé le fichier dans Management Studio.

Mais j'ai des problèmes avec la récupération du fichier.

Le code semble fonctionner, mais la base de données dans SQL Server est coincé dans "Restauration ..."

  if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       Server sqlServer = new Server(); 

       Restore sqlRestore = new Restore(); 
       sqlRestore.NoRecovery = true; 
       sqlRestore.Action = RestoreActionType.Database; 

       BackupDeviceItem deviceItem = new BackupDeviceItem(openFile.FileName, DeviceType.File); 
       sqlRestore.Devices.Add(deviceItem); 
       sqlRestore.Database = "firstRecoverTest"; 

       sqlRestore.SqlRestore(sqlServer); 

       //Add the recovered database into the Entity Table 
       SqlCommand intoEntity = new SqlCommand("IF NOT EXISTS(SELECT entityName FROM Entitys WHERE entityName = 'firstRecoveryTest') INSERT INTO Entitys VALUES ('firstRecoveryTest');", sqlConnection);     
       sqlConnection.Open(); 
       intoEntity.ExecuteNonQuery(); 

       Database db = default(Database); 
       db = sqlServer.Databases["firstRecoverTest"]; 
       db.RecoveryModel = (RecoveryModel)1; 
       db.AutoClose = true; 
       //db.Alter(); 

      } 

Dans l'exemple il y a une db.Alter(); fonction, mais cela génère une erreur indiquant que "Alter a échoué pour la base de données 'firstRecoverTest'".

S'il vous plaît laissez-moi savoir vos pensées

Merci à l'avance

MISE À JOUR

Après avoir inséré le "ReplaceDatabase = true;" il n'y avait pas de changement dans le résultat final. En passant aussi le code ligne par ligne, montre qu'il est à travers.

Le "db.Alter();" est juste celui placé à la fin du code (affiché comme commentaire). Il est utilisé dans la création de la sauvegarde et fonctionne sans erreur. InnerError affiche ces informations lors de l'utilisation de db.Alter();

« ALTER DATABASE n'est pas autorisée alors qu'une base de données est dans l'état de restauration »

La partie intéressante est les fichiers SQL journal. Je reçois 3 journaux:

"Démarrage de la base de données" firstRecoverTest "."

"La base de données 'firstRecoverTest' est marquée RESTORING et est dans un état qui ne permet pas l'exécution de la récupération."

"La base de données a été restaurée: Base de données: firstRecoverTest, date de création (heure): 2011/09/20 (15:44:48), première LSN: 37: 159: 37, dernière LSN: 37: 175: 1, nombre de périphériques de vidage: 1, informations sur le périphérique: (FILE = 1, TYPE = DISK: {'C: \ Users \ Administrator \ Desktop \ installer_backup'}). Message d'information Aucune action de l'utilisateur n'est requise. "

Cependant, quand je fais une normale récupérer à l'aide SQL Management Studio il y a 2 plus entrys journaux disant

"Démarrage de la base de données [databaseName] '."

« restauration est terminée sur la base de données [databaseName]. La base de données est maintenant disponible »

Je n'ai pas assez réputation pour poster une petite image de la façon dont il est dans SQL Management Studio unfortunatly.

Répondre

4

Vous devez essayer de supprimer la base de données ou d'utiliser sqlRestore.ReplaceDatabase = true;.

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.replacedatabase.aspx

Si cela ressemble à rien qui se passe, vous pouvez démarrer le processus dans un fil séparé et câbler les événements de notification des changements de progrès en utilisant ceux-ci.

sqlRestore.Complete += new ServerMessageEventHandler(completionEvent); 
sqlRestore.PercentCompleteNotification = 10; // Call progress event every x percent change. 
sqlRestore.PercentComplete += new PercentCompleteEventHandler(progressEvent); 

Si cela ne fonctionne pas, veuillez poster le code Alter qui ne fonctionnait pas. Vérifiez également les journaux et les autorisations du serveur SQL.

MISE À JOUR

Ok cette mise à jour est plus logique. La raison en est que vous définissez sqlRestore.NoRecovery = true;. Cela a pour effet qu'une fois la restauration terminée, la base de données est conservée dans un état de récupération, ce qui vous permet de restaurer une sauvegarde différentielle supplémentaire en plus de la sauvegarde complète que vous venez de restaurer.

Alors qu'il est dans cet état, vous ne pourrez plus rien faire dans la base de données. Je suggère que, sauf si vous l'exigez, vous laissez la valeur par défaut qui est NoRecovery = false.

Voir http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backuprestorebase.norecovery.aspx

espoir qui aide.

+0

J'ai mis à jour mon poste avec des informations qui peuvent aider à expliquer ce qui se passe – Seige

+0

@Seige S'il vous plaît voir la mise à jour. –

+0

Merci. Je pensais que j'avais essayé de changer cela, mais je devais avoir quelque chose d'autre qui a échoué. Cela a résolu le problème. Merci encore – Seige

Questions connexes