2010-10-20 53 views
3

J'utilise le code suivant pour restaurer une base de données de sauvegarde SQL avec C# et SMO.SMO "La restauration a échoué pour le serveur" Restauration de la sauvegarde à partir du fichier

void RestoreDatabaseWithSMO(string sConnect, string dbName, string backUpPath) 
{ 
    using (SqlConnection cnn = new SqlConnection(sConnect)) 
    { 
     cnn.Open(); 
     cnn.ChangeDatabase("master"); 

     ServerConnection sc = new ServerConnection(cnn); 
     Server sv = new Server(sc); 

     if (!sv.Databases.Contains(dbName)) 
      throw new Exception("this DataBase does not exist"); 

     // Create backup device item for the backup 
     BackupDeviceItem bdi = new BackupDeviceItem(backUpPath, DeviceType.File); 

     // Create the restore object 
     Restore resDB = new Restore(); 
     resDB.PercentComplete += new PercentCompleteEventHandler(percentComplete); 
     resDB.PercentCompleteNotification = 10; 
     resDB.Devices.Add(bdi); 
     resDB.NoRecovery = false; 
     resDB.ReplaceDatabase = true; 
     resDB.Database = dbName; 
     resDB.Action = RestoreActionType.Database; 

     // Restore the database 
     resDB.SqlRestore(sv);//Exception 
    } 
} 

mais dans la dernière ligne je suis en dessous de l'exception !!!

{"Restore failed for Server '\\\\.\\pipe\\3F103E6E-3FD4-47\\tsql\\query'. "} 

Quel est le problème avec elle?
Pourriez-vous s'il vous plaît me guider? grâce

Répondre

1

Je l'ai fait avec T-SQL

Exclusive access could not be obtained because the database is in use

void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath) 
{ 
    using (SqlConnection con = new SqlConnection(ConnectionString)) 
    { 
     con.Open(); 

     string UseMaster = "USE master"; 
     SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con); 
     UseMasterCommand.ExecuteNonQuery(); 

     string Alter1 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Single_User WITH Rollback Immediate"; 
     SqlCommand Alter1Cmd = new SqlCommand(Alter1, con); 
     Alter1Cmd.ExecuteNonQuery(); 

     string Restore = @"RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + @"' WITH FILE = 1, NOUNLOAD, STATS = 10"; 
     SqlCommand RestoreCmd = new SqlCommand(Restore, con); 
     RestoreCmd.ExecuteNonQuery(); 

     string Alter2 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Multi_User"; 
     SqlCommand Alter2Cmd = new SqlCommand(Alter2, con); 
     Alter2Cmd.ExecuteNonQuery(); 

     labelReport.Text = "Successful"; 
    } 
} 
+0

Pourquoi downvote? –

+0

Je suppose que c'est une réponse T-SQL à une question SMO. – LJNielsenDk