none
Restaurar el sistema RRS feed

  • Pregunta

  • Bueno tengo que decir que el siguiente código es correcto, pero no hace lo que debería:

    Ruta = Application.StartupPath & "\" & Me.txtBD.Text & ".MDF"

    BDDesconectar()

    sql = "RESTORE DATABASE [" & Ruta & "] FROM DISK ='" & txtRuta.Text & "\" & txtBD.Text & ".bak' WITH REPLACE"

     

    He puesto un Breakpoint, y he puesto una etiqueta de "Inspección", con estos resultados:

    txtBD.Text -> 'la base de datos', que es correcto.

    Ruta -> Nothing, aquí ya mal vamos.

    Application.StarupPath -> 'StartupPath' no es un miembro de 'MyApplication', este es el fallo, y no se por donde echarle el guante, a ver si alguin conoce está excepción...

     

    Un saludo y gracias.  

    • Cambiado Enrique M. Montejo martes, 6 de septiembre de 2011 16:51 acceso a datos (De:Lenguaje VB.NET)
    lunes, 21 de junio de 2010 22:48

Todas las respuestas

  • hola

    cuando usas este Application.StartupPath, lo haces desde el codigo un formulario ?

    o es dentro de una clase o libreria que ahs creado

    lo pregunto porque si analzias la documentacion de Application.StartupPath

    veras que este se encuantra bajo System.Windows.Forms, po eso deberias suarlo desde tu formulario

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 21 de junio de 2010 23:06
  • Leandro hay está la cuestión, porque esa clausula está dentro de un evento "click" de un botón de un formulario... no se que le puede pasar... pongo un pantallazo:

     

    http://img193.imageshack.us/img193/9177/statuppath.jpg

     

    El código es igual que para hacer una copia de seguridad, y esto si lo hace correctamente...

    Un saludo.

     

    martes, 22 de junio de 2010 9:02
  • Usa un equivalente:
    My.Computer.FileSystem.CurrentDirectory.ToString
    Saludo y Suerte.-
    martes, 22 de junio de 2010 9:30
  • La ruta me sigue dando como valor Nothing...

     

    He probado con poner "RESTORE DATABASE [" & My.Computer.FileSystem.CurrentDirectory.ToString & "]... y me coge el valor pero no me restaura la base de datos...

     

    Un saludo.

    martes, 22 de junio de 2010 14:26
  • ¿Estás seguro de que esa es la sintaxis correcta para el RESTORE DATABASE? Yo siempre lo he usado asi:

    RESTORE DATABASE [Nombre] FROM DISK='Ruta'

    Es decir, detrás de la palabra DATABASE sólo va el nombre de la base de datos (por ejemplo "Prueba"), mientras que la ruta donde está el backup va detrás del "FROM DISK" (por ejemplo, "C:\Copias\Prueba.bak").

    La ruta del .mdf no hay que indicarla en ningún sitio, porque el Sql Server ya la tiene guardada dentro de la base de datos master. Si quieres restaurar en una ubicación distinta, hay que añadir una cláusula "MOVE" al final del RESTORE.

    Por supuesto, estoy hablando de bases de datos "attachadas" al servidor. Si estás hablando de una base de datos en modo "user instance", entonces no hace falta un restore, basta con copiar el .mdf mientras esté desmontado.

    martes, 22 de junio de 2010 14:51
  • hola

    como imagine estabas ejecutando ese codigo desde una clase, no desde tu formulario

    usa algo como esto

    string path = System.Reflection.Assembly.GetExecutingAssembly().Location

    para tener la ruta donde esta el assembly de tu codigo

    Assembly.Location (Propiedad)

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 22 de junio de 2010 14:51
  • Me da el siguiente error:

    "El usuario no tiene permiso para modificar la base de datos 'BaseDatos.MFD' o la base de datos no existe. Error de la instrucción ALTER DATABASE."

    La base de datos la tengo creada, y si modifico registros tendria que tener permisos... aquí esta la sentencia ALTER...

    ALTER DATABASE [ClinicaSanAnton.mdf] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

     

    Un saludo.

    martes, 22 de junio de 2010 22:11
  • ahh creo que voy entendiendo

    lo que me parece suce es que no tienes que indicar una ruta fisica a tu base de datos, sino usar solo el nombre de la misma

    ALTER DATABASE [ClinicaSanAnton ] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

    pero lo importante aqui es que esto debe ejecutarse en un objeto SqlCommand, como comento Alberto la db tiene que estar attachada al servicio de sql server

    seria algo como esto

    Using conn As New SqlConnection("<connection string>")
        conn.Open()

        Dim sql As String = "ALTER DATABASE [ClinicaSanAnton] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"

        Dim cmd As New SqlCommand(sql, conn)

        cmd.ExecuteNonQuery()
    End Using

     

    o sea te conectas a la db, que esta attachada en el servicio de sql server y ejecutas el comando usando directamente el nombre de la misma

    no usas el nombre del archivo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 23 de junio de 2010 1:23
  • Por cierto, una observación que a lo mejor es obvia pero igual no te has dado cuenta: Para enviar la sentencia que cierra todas las conexiones a la base de datos, deberías abrir una conexión a OTRA base de datos (por ejemplo, la master), y desde esa conexión ejecutar el ALTER de la base de datos que quieres restaurar. Lo mismo pasa con el RESTORE, tienes que ejecutarlo desde una conexión que no esté abierta contra la propia base de datos que quieres restaurar.
    miércoles, 23 de junio de 2010 5:35
  • Sigue dando el error anterior...:

     

    Private Sub BDDesconectar()

     

    Using conn As New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Master;Integrated Security=True;Connect Timeout=30;User Instance=True")

    Dim sql As String = "ALTER DATABASE [ClinicaSanAnton] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"

    Dim cmd As New SqlCommand(sql, conn)

    Try

    conn.Open()

    cmd.ExecuteNonQuery()

    conn.Close()

    Catch ex As SqlException

    MessageBox.Show(ex.Message)

    End Try

            End Using

    End Sub

     

    Private Sub btnBackup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBackup.Click

    BDDesconectar()

    sql = "RESTORE DATABASE [ClinicaSanAnton.mdf] FROM DISK ='" & txtRuta.Text & "\" & txtBD.Text & ".bak' WITH REPLACE"

    BarraProgreso(Progreso)

    EjecutarSentencia(sql, cnSanAnton)

    End Sub

     

    Public Sub EjecutarSentencia(ByVal sql As String, ByVal Conexion As SqlConnection)

    oComando = New SqlCommand(sql, Conexion)

    Try

    Conexion.Open()

    oComando.ExecuteNonQuery()

    MessageBox.Show("Se ha restaurado la copia de seguridad satisfactoriamente", "Copia de seguridad de base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information)

    Catch ex As SqlException

    MessageBox.Show("Error al Restaurar la base de datos", "Copia de seguridad de base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

    Conexion.Close()

    End Sub

     

    Aquí tenéis todo el código del formulario, a ver si podemos sacar esto...

    Un saludo.

     

    miércoles, 23 de junio de 2010 13:04
  • hola

    el tema es que estas usando SQL Express, tiene sentido aplciar el SINGLE USER a este cuando se supone que es una db que solo una aplicacion local puede conectarse ?

    si estaria en un server donde muchos usuario se conectan, pero estando local no se si aplica

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 23 de junio de 2010 13:36
  • el tema es que estas usando SQL Express, tiene sentido aplciar el SINGLE USER a este cuando se supone que es una db que solo una aplicacion local puede conectarse ?

    Sí, es una técnica eficaz para cerrar todas las conexiones a la base de datos. Aunque el comando la deja como "single user", en realidad primero la pasa a "zero user", es decir, echa a todo el mundo que esté conectado (aunque "todo el mundo" sea una única conexión del usuario local). De esa manera se puede restaurar, porque mientras tenga alguna conexión abierta (aunque sólo sea de un único usuario local) no deja restaurarla.

    Por cierto, aunque sea SQL Express sí que se pueden abrir múltiples conexiones, tanto de varios usuarios locales como remotos (estos últimos están deshabilitados por defecto, pero se pueden habilitar las conexiones remotas).

     

    miércoles, 23 de junio de 2010 17:37