2010-10-20 183 views
3

我正在使用以下代码使用C#和SMO恢复备份SQL数据库。SMO“恢复服务器失败”从文件恢复备份

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 
    } 
} 

但在最后一行我得到了异常下面!

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

它有什么问题?
你能指导我吗?感谢

回答

1

我已经与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

做到了为什么downvote? – 2011-12-30 04:44:04

+0

我的猜测是因为它是一个SMO问题的T-SQL答案。 – LJNielsenDk 2015-10-19 08:48:06