用Sql语句实现备份与还原操作时,最好不要使用需要备份或还原的数据库连接,而使用master,否则可能会出现如下三个问题:(1)超时时间已到。在操作完成之前超时时间已过或服务器未响应。(2) 在向服务器发送请求时发生传输级错误。(provider:共享内存提供程序,error:0-系统无法打开文件。) (3)从服务器接收结果时发生传输级错误。(provider:共享内存提供程序,error:0 - 系统无法打开文件。)
还原或删除sql server数据库时,经常会出现:“因为数据库正在使用,所以无法获得对数据库的独占访问权”,解决方法是在还原语句前执行"Alter database BookShop Set Offline With rollback immediate”,还原语句后执行“Alter database BookShop Set Online With Rollback immediate”。
1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 5 namespace Util 6 { 7 class DbHelper 8 { 9 public static string DbName { get; set; } 10 11 private static SqlConnection SqlConnection = new SqlConnection("data source=.;Initial Catalog=master;integrated security=SSPI;"); 12 private static string SqlBackup = "BACKUP DATABASE BookShop TO DISK = 'F:\\ms\\src\\InternetBookstore\\DB\\" + DbName + ".bak'"; 13 private static string SqlRestore = "Alter database BookShop Set Offline With rollback immediate RESTORE DATABASE BookShop FROM DISK = 'F:\\ms\\src\\InternetBookstore\\DB\\" + DbName + ".bak' Alter database BookShop Set Online With Rollback immediate"; 14 private SqlCommand SqlCommandBackup = new SqlCommand() { Connection = SqlConnection, CommandType = CommandType.Text, CommandText = SqlBackup }; 15 private SqlCommand SqlCommandRestore = new SqlCommand() { Connection = SqlConnection, CommandType = CommandType.Text, CommandText = SqlRestore }; 16 17 public void DbBackup() 18 { 19 SqlConnection.Open(); 20 try 21 { 22 SqlCommandBackup.ExecuteNonQuery(); 23 } 24 catch (Exception e) 25 { 26 string str = e.Message; 27 SqlConnection.Close(); 28 } 29 SqlConnection.Close(); 30 } 31 32 public void DbRestore() 33 { 34 SqlConnection.Open(); 35 try 36 { 37 SqlCommandRestore.ExecuteNonQuery(); 38 } 39 catch (Exception e) 40 { 41 string str = e.Message; 42 SqlConnection.Close(); 43 } 44 SqlConnection.Close(); 45 } 46 } 47 }