Restaurar base de datos SQL desde programa.

05/11/2004 - 23:20 por Luis Carlos Villanueva Gilmet | Informe spam
Un saludo a todos.

Estoy haciendo una aplicación con Windows Form que se conecta a SQL Server.
Necesito restaurar la BD desde programa y para ello utilizo el siguiente
stored procedure que he ubicado

en la MASTER .


Create Procedure dbo.RestoreMiBD
@Path char
AS
RESTORE DATABASE CIJ FROM DISK = @Path WITH RECOVERY
GO


Esta opción me funciona perferctamente desde el analizador de consultas pero
cuando lo llamo desde C# ya no funciona. Me sale un error indicando que tengo
abierta la BD por lo cual no me puede restaurar

una base de datos en uso.

El código en C# es:


SqlConnection MiConeccionSQL=new
SqlConnection(clGlobal.VarStringConexiónMaster);
MiConeccionSQL.Open();
SqlCommand MiComandoSQL = new SqlCommand("RestoreMiBD", MiConeccionSQL);
MiComandoSQL.CommandType = CommandType.StoredProcedure;
SqlParameter Path =new SqlParameter("@Path", SqlDbType.Char, 255);
Path.Value = this.textBoxPathRestore.Text;
MiComandoSQL.Parameters.Add(Path);
MiComandoSQL.ExecuteNonQuery();
MiConeccionSQL.Close();



Agradeceré cualquier sugerencia sobre el tema.

Saludos,
Luis Carlos Villanueva
 

Leer las respuestas

#1 Octavio Telis Aynes
06/11/2004 - 00:59 | Informe spam
Veamos...

Si es un reemplazo de la anterior podrías agregar REPLACE a la clausula, con
eso SQL Server dentendrá los procesos sobre la base de datos y la restaurará
reemplazando a la anterior. Ahora bien, si no hay reemplazo y la base de
datos que quieres restaurar no tiene un registro de respaldo no podrás
reemplazarla, pues por seguridad SQL Server no permitirá que se sobreescriba
una base de datos de nombre coincidentes por error.

REPLACE

Especifica que SQL Server debe crear la base de datos especificada y sus
archivos relacionados aunque ya exista otra base de datos con el mismo
nombre. En ese caso, se elimina la base de datos existente. Cuando no se
especifica la opción REPLACE, se realiza una comprobación de seguridad, que
impide que se sobrescriba una base de datos distinta por accidente. La
comprobación de seguridad se asegura de que la instrucción RESTORE DATABASE
no restaurará la base de datos en el servidor actual si:

1.. La base de datos nombrada en la instrucción RESTORE ya existe en el
servidor actual.


2.. El nombre de la base de datos es diferente del nombre de la base de
datos registrado en el conjunto de copias de seguridad.
REPLACE también permite que RESTORE sobrescriba un archivo existente cuando
no se puede comprobar si pertenece a la base de datos que se está
restaurando. Normalmente, RESTORE no sobrescribe los archivos ya existentes.



En algo puede explicarte el comportamiento que estás sufriendo...

Aunque podrías también verifiacar si la base de datos tiene procesos activos
que puedan causar el mismo error.

En lo personal, utilizo REPLACE, para evitarme ese tipo de errores, aunque
simpre hago una verificación de la existencia de la base de datos y advierto
al usuario que la base de datos será reemplazada por la del respaldo.

En fin, espero te sea de utilidad.

Saludos...

Octavio Telis Aynés
www.comunidadpuntonet.org/df/


"Luis Carlos Villanueva Gilmet"
escribió en el
mensaje news:
Un saludo a todos.

Estoy haciendo una aplicación con Windows Form que se conecta a SQL


Server.
Necesito restaurar la BD desde programa y para ello utilizo el siguiente
stored procedure que he ubicado

en la MASTER .


Create Procedure dbo.RestoreMiBD
@Path char
AS
RESTORE DATABASE CIJ FROM DISK = @Path WITH RECOVERY
GO


Esta opción me funciona perferctamente desde el analizador de consultas


pero
cuando lo llamo desde C# ya no funciona. Me sale un error indicando que


tengo
abierta la BD por lo cual no me puede restaurar

una base de datos en uso.

El código en C# es:


SqlConnection MiConeccionSQL=new
SqlConnection(clGlobal.VarStringConexiónMaster);
MiConeccionSQL.Open();
SqlCommand MiComandoSQL = new SqlCommand("RestoreMiBD", MiConeccionSQL);
MiComandoSQL.CommandType = CommandType.StoredProcedure;
SqlParameter Path =new SqlParameter("@Path", SqlDbType.Char, 255);
Path.Value = this.textBoxPathRestore.Text;
MiComandoSQL.Parameters.Add(Path);
MiComandoSQL.ExecuteNonQuery();
MiConeccionSQL.Close();



Agradeceré cualquier sugerencia sobre el tema.

Saludos,
Luis Carlos Villanueva


Preguntas similares