Rivx Posted October 29, 2012 Report Share Posted October 29, 2012 Hola amigos: El cuento es el siguiente: Resulta que quiero ver la posibilidad de acceder a unos archivos de backup (.bak) de SQL SERVER sin usar el OpenFileDialog. Para ello, decidí usar un Listview que los lista (valga la redundancia). Lista estos archivos bien, pero al momento de elegir uno, para hacer la restauración correspondiente de la base de datos, esta no la hace, o muestra un error. la pregunta es: ¿Estaré haciendo algo mal, o pienso en otra cosa que no sea un ListView? Anexo el código del backup: Dim dir, bd As String dir = lv_respaldos.SelectedItems.Item(Name).ToString bd = "nombrebd" con_master() tab = New SqlCommand("Alter database nombrebd set SINGLE_USER With ROLLBACK IMMEDIATE", con) dadap.InsertCommand = tab dadap.InsertCommand.ExecuteNonQuery() tab = New SqlCommand("alter database nombrebd set multi_user", con) dadap.InsertCommand = tab dadap.InsertCommand.ExecuteNonQuery() Dim sBackup As String = "RESTORE DATABASE [nombrebd] FROM DISK = '" & Trim(dir) & "' WITH REPLACE" Dim csb As New SqlConnectionStringBuilder ' csb.DataSource = Me.TxtServido.Text 'Es mejor abrir la conexión con la base Master csb.InitialCatalog = "master" csb.IntegratedSecurity = True Try Dim cmdBackUp As New SqlCommand(sBackup, con) cmdBackUp.ExecuteNonQuery() MessageBox.Show("Se ha restaurado la copia de la base de datos. Para visualizar los cambios, debe reiniciar el Sistema.", _ "Restaurar base de datos", _ MessageBoxButtons.OK, MessageBoxIcon.Information) con.Close() Catch ex As Exception MessageBox.Show(ex.Message, _ "Error al restaurar la base de datos", _ MessageBoxButtons.OK, MessageBoxIcon.Error) con.Close() End Try Me.Hide() Por su ayuda, o por su lectura, muchas gracias. :8[ Link to comment Share on other sites More sharing options...
susodicho Posted October 30, 2012 Report Share Posted October 30, 2012 :mmm: ¿Revisaste el valor de dir? Se me ocurre que no tiene el nombre del archivo Otra cosa, el bloque Try deberías escribirlo así: Try Dim cmdBackUp As New SqlCommand(sBackup, con) cmdBackUp.ExecuteNonQuery() MessageBox.Show("Se ha restaurado la copia de la base de datos. Para visualizar los cambios, debe reiniciar el Sistema.", _ "Restaurar base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information) Catch ex As Exception MessageBox.Show(ex.Message, "Error al restaurar la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally con.Close() End Try o sea, el con.Close() va dentro de un Finally Link to comment Share on other sites More sharing options...
Rivx Posted October 31, 2012 Author Report Share Posted October 31, 2012 :mmm: ¿Revisaste el valor de dir? Se me ocurre que no tiene el nombre del archivo Otra cosa, el bloque Try deberías escribirlo así: Try Dim cmdBackUp As New SqlCommand(sBackup, con) cmdBackUp.ExecuteNonQuery() MessageBox.Show("Se ha restaurado la copia de la base de datos. Para visualizar los cambios, debe reiniciar el Sistema.", _ "Restaurar base de datos", MessageBoxButtons.OK, MessageBoxIcon.Information) Catch ex As Exception MessageBox.Show(ex.Message, "Error al restaurar la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally con.Close() End Try o sea, el con.Close() va dentro de un Finally Gracias por tu respuesta. En efecto, el dir no esta obteniendo el archivo, el problema es que por ListView no lo he podido obtener. :8[ Link to comment Share on other sites More sharing options...
susodicho Posted October 31, 2012 Report Share Posted October 31, 2012 (edited) La línea dir = lv_respaldos.SelectedItems.Item(Name).ToString reemplázala por esto: Dim token As IEnumerator = lv_respaldos.SelectedItems.GetEnumerator() If token.MoveNext() Then dir = CType(token.Current, ListViewItem).Text End If ten en cuenta que podría no haber ningún elemento seleccionado (y haces las modificaciones correspondientes). Si no hay elementos seleccionados, el método MoveNext() devuelve False. OJO: Estoy asumiendo que el nombre del archivo de respaldo (.BAK) está en la propiedad Text del ListViewItem, tampoco estoy seguro si tiene el nombre completo del archivo (incluyendo la ruta de acceso) o sólo el nombre de archivo. Incluso podrías usar la propiedad Tag para guardar parte del nombre, o sea, podrías usar la propiedad Text para el nombre del archivo (por ejemplo: Copia250712.bak) y la propiedad Tag guardaría el nombre de la carpeta en donde se encuentra (por ejemplo: C:\DBdata\Respaldos), así creo se vería más ordenado el ListView . En todo caso, si todos los respaldos están en la misma carpeta, no habría necesidad de usar la propiedad Tag. Otra cosa, supongo que la propiedad MultiSelect del ListView es False (no tiene sentido elegir más de una copia de seguridad). Edited October 31, 2012 by susodicho Link to comment Share on other sites More sharing options...
Rivx Posted November 8, 2012 Author Report Share Posted November 8, 2012 (edited) susodicho: Reviso y te cuento. Edito: Sigue con el error de restauración. Te mando una foto: :8) Edited November 8, 2012 by Rivx Link to comment Share on other sites More sharing options...
susodicho Posted November 10, 2012 Report Share Posted November 10, 2012 Por lo que entiendo, el código de error que devuelve el SQL Server es el ERROR_FILE_NOT_FOUND. :mmm: Para descartar problemas de permisos (UAC o similares) podrías hacer lo siguiente: Hacer que el usuario elija el archivo de respaldo usando OpenFileDialog (sí, ya sé que no quieres usar esta forma). Así te aseguras que el nombre de archivo (y la ruta completa) es válido. Una vez que tienes el nombre de archivo, verificas que existe usando File.Exists Creo que podría ser un problema con permisos y, si fuese así, quizás tendrías que cambiar el manifiesto de tu aplicación. Link to comment Share on other sites More sharing options...
Rivx Posted November 15, 2012 Author Report Share Posted November 15, 2012 ¿Manifiesto? Link to comment Share on other sites More sharing options...
susodicho Posted November 20, 2012 Report Share Posted November 20, 2012 En VB.NET 2010 (no sé si será igual en la versión 2008 ) tienes que ir a las propiedades del proyecto, en la pestaña Aplicación haces clic en el botón Ver configuración de Windows y ahí puedes editar el Manifiesto de tu aplicación. Lee esta página para tener una idea de qué modificaciones tienes hacer al manifiesto (básicamente tendrías que cambiar el atributo requestedExecutionLevel). :mmm: En una de esas el problema sea que el usuario pertenece a un grupo que no tiene permisos para realizar operaciones asociadas a restauración de bases de datos (no puede usar RESTORE). Ver aquí Link to comment Share on other sites More sharing options...
Rivx Posted November 20, 2012 Author Report Share Posted November 20, 2012 (edited) Revisando. La opción en vb 2008 es Ver Configuración del UAC PD: Esto debería revisarlo a pesar de que son usuarios (datos) en la bd? Porque no son usuarios creados para base de datos. :8) Edited November 20, 2012 by Rivx Link to comment Share on other sites More sharing options...
Ra Posted November 21, 2012 Report Share Posted November 21, 2012 Copia el texto que tiene la variable sBackup y pégala directamebte en el sql server management studio... Ahí puedes obtener más información sobre el error... La conexión en el ssms tienes que hacerla con el mismo usuario... Esta es buena práctica para varias situaciones (errores) que puedan aparecer... Estoy casi 100% seguro que el error está en el usuario que está configurado para correr el servicio de sql server... Este usuario no tiene permisos para acceder al sistema local... Por lo tanto, una solución (o prueba) que puddes hacer es cambiar el usuario a LocalSystem. Salu2. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now