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 Sistema;
usando System.Configuration;
usando System.Data.SqlClient;
usando System.Data;
espacio de nombres web.base_class
{
/// <resumen>
/// Clase DbOper, utiliza principalmente SQLDMO para realizar copias de seguridad y recuperación de la base de datos de Microsoft SQL Server
/// </summary>
clase pública DbOper
{
servidor de cadena privado;
uid de cadena privada;
contraseña de cadena privada;
base de datos de cadenas privadas;
conexión de cadena privada;
/// <resumen>
/// Constructor de la clase DbOper
/// </summary>
público DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
servidor=cortar(conexion,"servidor=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
base de datos=cut(conn,"base de datos=",";");
}
corte de cadena pública (cadena str, cadena bg, cadena ed)
{
subcadena;
sub=str.Substring(str.IndexOf(bg)+bg.Longitud);
sub=sub.Substring(0,sub.IndexOf(";"));
sub de retorno;
}
/// <resumen>
/// Copia de seguridad de la base de datos
/// </summary>
bool público DbBackup (URL de cadena)
{
SQLDMO.Backup oBackup = nuevo SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = nuevo SQLDMO.SQLServerClass();
intentar
{
oSQLServer.LoginSecure = falso;
oSQLServer.Connect(servidor,uid,contraseña);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = base de datos;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = base de datos;
oBackup.BackupSetDescription = "Copia de seguridad de la base de datos";
oBackup.Initialize = verdadero;
oBackup.SQLBackup(oSQLServer);
devolver verdadero;
}
atrapar
{
devolver falso;
tirar;
}
finalmente
{
oSQLServer.DisConnect();
}
}
/// <resumen>
/// recuperación de base de datos
/// </summary>
cadena pública DbRestore (URL de cadena)
{
if(exepro()!=true)//Ejecutar el procedimiento almacenado
{
devolver "Operación fallida";
}
demás
{
SQLDMO.Restore oRestore = nuevo SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = nuevo SQLDMO.SQLServerClass();
intentar
{
oSQLServer.LoginSecure = falso;
oSQLServer.Connect(servidor, uid, contraseña);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = base de datos;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = verdadero;
oRestore.SQLRestore(oSQLServer);
devolver "bien";
}
captura (Excepción e)
{
devolver "Error al restaurar la base de datos";
tirar;
}
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","puerto");
intentar
{
conexión1.Open();
cmd.ExecuteNonQuery();
devolver verdadero;
}
captura (Excepción ex)
{
devolver falso;
}
finalmente
{
conexión1.Cerrar();
}
}
}
}