备份数据库
/// <summary> /// 备份配置文件config.xml中数据库 /// </summary> /// <param name="backupFolder">备份文件路径</param> /// <returns></returns> public static bool DataBackupConfigDB(string backupFolder) { //获取配置文件中sql数据库名 string dbName = "SqlDB"; string name = dbName + DateTime.Now.ToString("yyyyMMddHHmmss"); string procname; string sql; //创建连接对象 SqlConnection conn = new SqlConnection(GetConnStr()); conn.Open(); //打开数据库连接 //删除逻辑备份设备,但不会删掉备份的数据库文件 procname = "sp_dropdevice"; SqlCommand sqlcmd1 = new SqlCommand(procname, conn); sqlcmd1.CommandType = CommandType.StoredProcedure; SqlParameter sqlpar = new SqlParameter(); sqlpar = sqlcmd1.Parameters.Add("@logicalname", SqlDbType.VarChar, 20); sqlpar.Direction = ParameterDirection.Input; sqlpar.Value = dbName; try //如果逻辑设备不存在,略去错误 { sqlcmd1.ExecuteNonQuery(); } catch { MessageBox.Show("错误的备份文件目录"); } //创建逻辑备份设备 procname = "sp_addumpdevice"; SqlCommand sqlcmd2 = new SqlCommand(procname, conn); sqlcmd2.CommandType = CommandType.StoredProcedure; sqlpar = sqlcmd2.Parameters.Add("@devtype", SqlDbType.VarChar, 20); sqlpar.Direction = ParameterDirection.Input; sqlpar.Value = "disk"; sqlpar = sqlcmd2.Parameters.Add("@logicalname", SqlDbType.VarChar, 20);//逻辑设备名 sqlpar.Direction = ParameterDirection.Input; sqlpar.Value = dbName; sqlpar = sqlcmd2.Parameters.Add("@physicalname", SqlDbType.NVarChar, 260);//物理设备名 sqlpar.Direction = ParameterDirection.Input; sqlpar.Value = backupFolder + name + ".bak"; try { int i = sqlcmd2.ExecuteNonQuery(); } catch (Exception err) { string str = err.Message; } //备份数据库到指定的数据库文件(完全备份) sql = "BACKUP DATABASE " + dbName + " TO " + dbName + " WITH INIT"; SqlCommand sqlcmd3 = new SqlCommand(sql, conn); sqlcmd3.CommandType = CommandType.Text; try { sqlcmd3.ExecuteNonQuery(); } catch (Exception err) { string str = err.Message; conn.Close(); return false; } conn.Close();//关闭数据库连接 return true; }
还原数据库时如果使用
RESTORE DATABASE dbName(数据库名) from DISK = 'e:/' to replace
sql错误提示:RESTORE 无法处理数据库dbName 因为它正由此会话使用 建议在执行此操作时使用 master 数据库
在网上终于找到了解决方法,具体代码如下:
/// <summary> /// 还原数据库文件 /// </summary> /// <param name="dbFile">数据库备份文件(含路径)</param> /// <returns></returns> public static bool DataRestoreConfigDB(string dbFile) { //sql数据库名 string dbName = "SqlDB"; //创建连接对象 SqlConnection conn = new SqlConnection(GetConnStr()); //还原指定的数据库文件 string sql =string.Format("use master ;declare @s varchar(8000);select @s=isnull(@s,'')+' kill '+rtrim(spID) from master..sysprocesses where dbid=db_id('{0}');select @s;exec(@s) ;RESTORE DATABASE {1} FROM DISK = N'{2}' with replace",dbName,dbName,dbFile); SqlCommand sqlcmd = new SqlCommand(sql, conn); sqlcmd.CommandType = CommandType.Text; conn.Open(); try { sqlcmd.ExecuteNonQuery(); } catch (Exception err) { string str = err.Message; conn.Close(); return false; } conn.Close();//关闭数据库连接 return true; }