Jump to content

Ayuda con Listview en vb 2008


Recommended Posts

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

: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

: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

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 :nose: . 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 by susodicho
Link to comment
Share on other sites

  • 2 weeks later...

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. :nose:

 

Link to comment
Share on other sites

En VB.NET 2010 (no sé si será igual en la versión 2008 :nose: ) 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).

 

Dfl1ht3p7qzGU5.png

 

: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

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 by Rivx
Link to comment
Share on other sites

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...