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)
usando o sistema;
usando System.Configuration;
usando System.Data.SqlClient;
usando System.Data;
namespace web.base_class
{
/// <resumo>
/// Classe DbOper, usa principalmente SQLDMO para realizar backup e recuperação de banco de dados Microsoft SQL Server
/// </sumário>
classe pública DbOper
{
servidor de string privado;
string privada uid;
string privada pwd;
banco de dados de strings privado;
conexão de string privada;
/// <resumo>
/// Construtor da classe DbOper
/// </sumário>
DbOper público()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
servidor=cut(conn,"servidor=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
banco de dados=cut(conn,"banco de dados=",";");
}
corte de string pública (string str,string bg,string ed)
{
string sub;
sub=str.Substring(str.IndexOf(bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(";"));
retornar sub;
}
/// <resumo>
/// Backup do banco de dados
/// </sumário>
bool público DbBackup(string url)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
tentar
{
oSQLServer.LoginSecure = falso;
oSQLServer.Connect(servidor,uid,pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = banco de dados;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = banco de dados;
oBackup.BackupSetDescription = "Backup do Banco de Dados";
oBackup.Initialize = verdadeiro;
oBackup.SQLBackup(oSQLServer);
retornar verdadeiro;
}
pegar
{
retornar falso;
lançar;
}
finalmente
{
oSQLServer.DisConnect();
}
}
/// <resumo>
/// Recuperação de banco de dados
/// </sumário>
string pública DbRestore(string url)
{
if(exepro()!=true)//Executa o procedimento armazenado
{
retornar "Falha na operação";
}
outro
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
tentar
{
oSQLServer.LoginSecure = falso;
oSQLServer.Connect(servidor,uid,pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMOREstore_Database;
oRestore.Database = banco de dados;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = verdadeiro;
oRestore.SQLRestore(oSQLServer);
retorne "ok";
}
pegar(Exceção e)
{
return "Falha ao restaurar banco de dados";
lançar;
}
finalmente
{
oSQLServer.DisConnect();
}
}
}
bool privado exepro()
{
SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname","porta");
tentar
{
conn1.Open();
cmd.ExecuteNonQuery();
retornar verdadeiro;
}
catch(Exceção ex)
{
retornar falso;
}
finalmente
{
conn1.Fechar();
}
}
}
}