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 de restaurar, 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 System;
usando System.Configuration;
usando System.Data.SqlClient;
usando System.Data;
web.base_class
{
/// <summary>
/// Classe DbOper, usa principalmente SQLDMO para realizar o backup e recuperação do Microsoft SQL Server banco de dados
/// </summary>
public
class DbOper
{
private string server;
private string uid;
private
string
pwd;
private
string conn;
resumo>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString(
)
;
=",";");
pwd=cut(conn,"pwd=",";");
banco de dados=cut(conn,"database=",";");
}
public string cut(string str,string bg ,string ed)
{
string
sub=str.Substring(str.IndexOf
(
bg)+bg.Length)
;
/// <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();
}
}
}
}