Problema al restaurar copia de seguridad (sql server)

Iniciado por Hartigan, 13 Septiembre 2010, 04:10 AM

0 Miembros y 1 Visitante están viendo este tema.

Hartigan

Hola, pues resulta que hago una copia de seguridad y me funciona perfectamente, pero a la hora de restaurarla me da un error y me dice la bdd está en uso.....

porqué????

Mi código es el siguiente:

Código (sql) [Seleccionar]

public override bool Restaurar_Copia(string dataBase, string ruta)
       {
           Boolean exito = false;

           String queryRestore = "RESTORE DATABASE agenda FROM DISK = '" + ruta + "'" + " WITH REPLACE";


           SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
           csb.DataSource = "(local)\\SQLEXPRESS";
           // Es mejor abrir la conexión con la base Master
           csb.InitialCatalog = "master";
           csb.IntegratedSecurity = true;
           

           using (SqlConnection con = new SqlConnection(csb.ConnectionString))
           {
               try
               {
                   con.Open();

                   SqlCommand cmdBackUp = new SqlCommand(queryRestore, con);
                   cmdBackUp.ExecuteNonQuery();
                   MessageBox.Show("Se ha restaurado la copia de la base de datos.",
                                   "Restaurar base de datos",
                                   MessageBoxButtons.OK,
                                   MessageBoxIcon.Information);

                   con.Close();
               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message,
                                   "Error al restaurar la base de datos",
                                   MessageBoxButtons.OK,
                                   MessageBoxIcon.Error);
               }
           }
}


He depurado el StackTrace me dice esto: StackTrace = "   en System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)\r\n   en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)\r\n   en System.Data.SqlClient.TdsParser.Run(RunBehavior run...


:huh: :huh: :huh: :huh:


[D4N93R]

Intentaste usar "RESTORE DATABASE agenda FROM DISK =  turuta WITH REPLACE" directamente en sql server, a ver que pasa, es decir, ahcerlo a mano?

Hartigan

lo he probado como dices y sí funciona.

Desde el código no funciona porque dice que la base de datos está en uso y no se porqué... como hago para comprobar si hay alguna conexión abierta??

[D4N93R]

Quita esta linea, a ver.
Código (csharp) [Seleccionar]
csb.InitialCatalog = "master";

Hartigan

He modificado el cógido y he puesto lo siguiente:

Código (sql) [Seleccionar]

public override bool Restaurar_Copia(string dataBase, string ruta)
        {
            Boolean exito = false;

            String queryRestore = "USE Master; RESTORE DATABASE agenda FROM DISK = '" + ruta + "' WITH REPLACE";

           
            using (SqlConnection con = new SqlConnection(this.cadena_conexion))
            {
                try
                {
                    con.Open();

                    SqlCommand cmdBackUp = new SqlCommand(queryRestore, con);
                    cmdBackUp.ExecuteNonQuery();
                    MessageBox.Show("Se ha restaurado la copia de la base de datos.",
                                    "Restaurar base de datos",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);

                    con.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message,
                                    "Error al restaurar la base de datos",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                }
            }


y me sigue pasando lo mismo, la base de datos está en uso!!!!! ppero si cierro todas las conexiones!!!, quien leñe accede a la bdd???  la bdd además no permite varias conexiones??? porque si no es así vaya ***** que es el sql server...  :-(

[D4N93R]

"USE Master;???? es lo mismo que el otro código, intenta sin usar una base de datos. No se por que tienes que indicar que usas master..

Hartigan

#7
Cita de: [D4N93R] en 18 Septiembre 2010, 18:23 PM
"USE Master;???? es lo mismo que el otro código, intenta sin usar una base de datos. No se por que tienes que indicar que usas master..

porque segun he leido es necesario usar la base de datos master... lol.

Quitando eso me dice que no se puede usar la base de datos agenda en esta sesión porque esta en uso. Que utilice la base de datos master.....

y la uso y me dice que agenda está en uso. Puede ser porque la etoy usando en la propia aplicación??? pero si cierro las conexiones no debería.... o no se...

[D4N93R]

#8
Posiblemente haya otra conexión bloqueando la la base de datos que quieres restaurar.

checa esto, y dejame hacer unas pruebas acá.

http://www.kodyaz.com/articles/identify-kill-blocking-sql-server-processes.aspx

EDIT:

En Sql Server 2008 es así
Código (sql) [Seleccionar]
RESTORE DATABASE [Testing] FROM  DISK = N'<Ruta>' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10