A última vez que trabalhei em um projeto que envolvia restauração e recuperação de banco de dados, pesquisei online e descobri que ele foi implementado usando SQLDMO. Você só precisa adicionar uma referência SQLDMO e, em seguida, usar os métodos das classes a seguir para alcançá-lo.
Expandi a classe do autor original para que ela possa reconhecer automaticamente a string de conexão do banco de dados no web.config e restaurar as informações recuperadas por meio de configurações variáveis.
Você precisa prestar atenção ao restaurar. O maior problema é ao restaurar. Quando outros usuários usam o banco de dados, eles não conseguem restaurar. A solução é adicionar um procedimento armazenado no banco de dados MASTER.
criar proc killspid (@dbname varchar(20))
como
começar
declare @sql nvarchar(500)
declare @spid int
set @sql='declare o cursor getpid para
selecione spid de sysprocesses onde dbid=db_id( '''+@dbname+''')'
exec(@sql)
abra o getpid
buscar o próximo de getpid em @spid
enquanto @@fetch_status<>-1
começar
exec('matar '+@spid )
buscar o próximo de getpid em @spid
fim
fechar getpid
desalocargetpid
fim
IR
Para executar este procedimento armazenado antes da restauração, você precisa passar dbname, que é o nome do seu banco de dados. A seguir está o código original da classe: (a string de conexão do banco de dados em web.config é constr)
using
System
;
using System.Configuration;
usingSystem.Data.SqlClient
using System.Data
;
<summary >
/// Classe DbOper, usa principalmente SQLDMO para implementar backup e recuperação de banco de dados Microsoft SQL Server
/// </summary>
public class DbOper
{
private
string server;
private
string uid
;
string conn ;
/// <summary>
/// Construtor da classe DbOper
/// </summary>
public DbOper(
)
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
(conn,"servidor=",";");
uid=
cut(conn,"uid=",";")
;
, "database=",";");
}
public
string cut(string str,string bg,string ed)
{
string
sub=str.Substring(str.IndexOf(bg)+bg.Length);
.Substring(0,sub.IndexOf(";")
)
;
/// <summary>
/// Backup do banco de dados
/// </summary>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = new
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
tente
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(servidor,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = banco de dados
; ";
oBackup.BackupSetName = banco de dados;
oBackup.BackupSetDescription = "Backup do banco de dados";
oBackup.Initialize = true;
oBackup.SQLBackup (oSQLServer);
return true;
}
catch
{
return false;
throw;
}
finalmente
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// Recuperação do banco de dados
/// </summary>
public string DbRestore(string url)
{
if(exepro()!=true)//Executar procedimento armazenado
{
return "Operação falhou"
}
else
{;
SQLDMO.Restore oRestore
=
novo
SQLDMO.RestoreClass
(
)
;
.SQLDMORestore_Database;
oRestore.Database = banco de dados;
oRestore.Files
=
url;//@"d:Northwind.bak
"
;
;
}
catch(Exception e)
{
return "Falhaao
restaurar o banco de dados
"
;
throw
;
finalmente
{
oSQLServer.DisConnect
(
)
;
uid ="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname " ,"porta");
try
{
conn1.Open();
cmd.ExecuteNonQuery();
return true;
}
catch(Exception ex)
{
return false;
}
finalmente
{
conn1.Close();
}
}
}
}