La última vez que trabajé en un proyecto que involucraba restauración y recuperación de bases de datos, busqué en línea y descubrí que se implementó usando SQLDMO. Solo necesita agregar una referencia de SQLDMO y luego usar los métodos de las siguientes clases para lograrlo.
Amplié la clase del autor original para que pueda reconocer automáticamente la cadena de conexión de la base de datos en web.config y restaurar la información recuperada mediante configuraciones variables.
Debe prestar atención al restaurar. El mayor problema es al restaurar. Cuando otros usuarios usan la base de datos, no pueden restaurar. La solución es agregar un procedimiento almacenado en la base de datos MAESTRA.
crear proc killspid (@dbname varchar(20))
como
comenzar
declarar @sql nvarchar(500)
declarar @spid int
set @sql='declarar el cursor getpid para
seleccione spid de sysprocesses donde dbid=db_id( '''+@dbname+''')'
ejecutivo(@sql)
abrir getpid
buscar siguiente desde getspid a @spid
mientras @@fetch_status<>-1
comenzar
ejecutivo('matar '+@spid )
buscar siguiente desde getspid a @spid
fin
cerrar getpid
desasignargetpid
fin
IR
Para ejecutar este procedimiento almacenado antes de restaurar, debe pasar dbname, que es el nombre de su base de datos. El siguiente es el código original de la clase: (la cadena de conexión de la base de datos en web.config es constr)
usando System;
usando
System.Configuration;
usando System.Data.SqlClient;
usando System.Data
web.base_class
;
<summary>
/// Clase DbOper, utiliza principalmente SQLDMO para implementar la copia de seguridad y recuperación de la base de datos de Microsoft SQL Server
///
</summary>
public class DbOper
{
private
string server;
private
string pwd;
string conn ;
/// <summary>
/// Constructor de la clase DbOper
/// </summary>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString()
server=cut
;( conexión,"servidor=",";");
uid=cut(conexión,"uid=",";");
pwd=
cut(conexión,"pwd=",";");
, "database=",";");
}
cadena
pública cortada (cadena cadena, cadena bg, cadena ed)
{
cadena
sub=str.Substring(str.IndexOf(bg)+bg.Length);
.Subcadena(0,sub.IndexOf(";"));
devolver sub
;
/// <summary>
/// Copia de seguridad de la base de datos
/// </summary>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass()
;
intente
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(servidor,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database =
base de datos;
//"d:Northwind.bak; ";
oBackup.BackupSetName = base de datos;
oBackup.BackupSetDescription = "Copia de seguridad de la base de datos";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
devuelve verdadero;
}
captura
{
devuelve falso;
lanza;
}
finalmente
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// Recuperación de la base de datos
/// </summary>
public string DbRestore(string url)
{
if(exepro()!=true)//Ejecutar procedimiento almacenado
{
return "Operación fallida"
}
else
{
SQLDMO.Restore oRestore = nuevo SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = nuevo SQLDMO.SQLServerClass();
intente
{
oSQLServer.LoginSecure
= false
;
.SQLDMORestore_Database;
oRestore.Database = base de datos
;
oRestore.ReplaceDatabase
=
true
;
;
}
catch(Exception e)
{
return "Error al restaurar la base de datos";
throw
}
finalmente
{
oSQLServer.DisConnect();
} }
}
private
bool exepro()
{
SqlConnection conn1 = new SqlConnection("servidor="+servidor+"; uid ="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname " ,"puerto");
intente
{
conn1.Open();
cmd.ExecuteNonQuery();
devuelve verdadero;
}
catch(Exception ex)
{
devuelve falso;
}
finalmente
{
conn1.Close();
}
}
}
}