Visual Basic.NET - Backup de base de datos SQL desde aplicación en Visual.net

 
Vista:
sin imagen de perfil
Val: 93
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Backup de base de datos SQL desde aplicación en Visual.net

Publicado por María Inés (49 intervenciones) el 18/08/2018 17:06:06
Buenos días! Luego de búsquedas infructuosas solicito nuevamente su ayuda.
Estoy en la primera aproximación de lo que necesito hacer en realidad, necesito hacer backups de bases de datos de SQL completas, diferenciales y también transaccionales (es a la conclusión que llegué leyendo) dado que no puedo perder nada de la información que registro (son historias clínicas es importante que no pierda nada de nada). Por otro lado debería también encriptar el backup para que nadie pueda recuperarlo excepto yo. He venido leyendo sobre el tema, sé que debo ver el tema de certificados y demás (cosa que todavía no he resuelto) porque empecé por probar hacer desde Visual un backup completo y de allí seguir avanzando con lo que necesito.
El tema que me encuentro trabada aquí porque me aparece un error que ahora les detallaré. Empleé 3 códigos distintos que hallé por la web y todos me dan ese mismo error.
Esto es lo que sale: "No se puede abrir el dispositivo de copia de seguridad. Error de sistema operativo 123 (El nombre del archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen no son correctos). Fin anómalo de BACKUP DATABASE.
Con otro código me aparecía acceso no válido (error de sistema operativo 5). Eso me llevó a investigar sobre el error y vi que decían que tenía que ver con los permisos del usuario o de SQL sobre las carpetas. Di con una solución que aconsejaba entrar a Herramientas, servicios y cambiar en SQL el usuario que inicia sesión por local. No cambió el resultado. También vi que decían de poner que la carpeta donde quiero hacer el backup tuviera todo tipo de permisos, pero las carpetas donde intenté tienen permisos totales al usuario dado que soy la administradora de la cuenta, además que intenté en un pen y también da error.
Bueno, aclaro que sólo usaré yo tanto el programa como la base de datos y que el motivo por el cual se me ocurrió hacerlo desde la aplicación es porque al final del día de trabajo me gustaría programar un backup diferencial y puesto que no siempre termino de trabajar a la misma hora, pensé que era mejor hacerlo desde la aplicación antes de cerrarla, además para permitir elegir la carpeta donde lo quiero guardar con un cuadro de diálogo. Lógicamente que como seré yo la usuaria podría hacerlo desde SQL pero se me había ocurrido la idea de hacerlo más práctico.
Se acepta todo tipo de sugerencia dado que en el tema estoy bastante perdida, leí mucho pero no llegué a muchas conclusiones que me hagan avanzar.
Desde ya muchas gracias!

María Inés

(PD: no pegué el código porque antes de preguntar probé muchos diferentes y ninguno me sirve, me hace pensar que más allá de que pueda haber algún error ahí, es otra cosa, son códigos que andan circulando por toda la web, no quise hacerlo más largo, si consideran oportuno en otra respuesta se los pego.)
Versión de VisualStudio 2017, SQL Server Managament 17 y SO Win 8.1 de 64 bits.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.468
Plata
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Backup de base de datos SQL desde aplicación en Visual.net

Publicado por Wilfredo Patricio Castillo (635 intervenciones) el 20/08/2018 19:01:51
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 93
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Backup de base de datos SQL desde aplicación en Visual.net

Publicado por María Inés (49 intervenciones) el 20/08/2018 23:37:03
Hola Wilfredo! Qué alegría leerte! Siempre tan generoso ayudándome. Te cuento, uno de los ejemplos que probé, en mi ignorancia me pareció "más completo" porque usaba estas referencias que me sugerís. Pero por alguna razón que no me doy cuenta, no completa la acción, de tal modo que tampoco me tira fallo, simplemente no hace nada y no sé tampoco dónde está el error. Te pego aquí abajo el código a ver dónde la he pifiado:
-añadí referencias a Microsoft.SqlServer.ConnectionInfo
-a Microsoft.SqlServer.Managament.Sdk.Sfc
-a Microsoft.SqlServer.Smo

Los objetos son:
-ComboBox para el nombre del servidor (CMB_ServerName)
-ComboBox para la autenticación (CMB_Auntenticacion, el item 0 para Windows y el 1 para SQL)
-ComboBox para las bases de datos (CMB_DataBaseName)
-Dos textbox para usuario y contraseña: TEX_Usuario y TEX_Password
-Y el botón crear

En la parte de Imports puse el Microsoft.Sql.Server.Smo

y luego aquí el código en sí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Imports Capa_Datos
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Smo
Public Class Frm_BackupHierbas
    Dim Database As String
    Dim Cmd As SqlCommand
    Dim cnn As SqlConnection
    Dim get_servername As String
    Dim get_password As String
    Dim get_userid As String
    Dim constr As String
    Dim dataaffector As Integer
 
    Private Sub Frm_Backup_Load(sender As Object, e As EventArgs) Handles Me.Load
        Try
            'Cargar items al servidor
            CMB_ServerName.Items.Add(My.Computer.Name.ToString & "\SQLExpress")
            CMB_ServerName.Items.Add("Localhost\SQLEspress")
 
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
    Private Sub CMB_DataBaseName_DropDown(sender As Object, e As EventArgs) Handles CMB_DataBaseName.DropDown
        Try
            Me.Cursor = Cursors.WaitCursor
            CMB_DataBaseName.Items.Clear()
            Dim ServerName As String = CMB_ServerName.Text.ToString
            Dim Serverconnection As Microsoft.SqlServer.Management.Common.ServerConnection = New Microsoft.SqlServer.Management.Common.ServerConnection
            Serverconnection.LoginSecure = True
            If CMB_Autenticacion.SelectedIndex = 1 Then 'con sql
                Serverconnection.LoginSecure = False
                Serverconnection.Login = TEX_User.Text
                Serverconnection.Password = TEX_Password.Text
            End If
            Dim Server As New Server(Serverconnection)
            Try
                For Each Database As Database In Server.Databases
                    CMB_DataBaseName.Items.Add(Database.Name)
 
                Next
            Catch ex As Exception
                Me.Cursor = Cursors.Default
                Dim Exception As String = ex.Message
 
            End Try
            Me.Cursor = Cursors.Default
        Catch ex As Exception
            Me.Cursor = Cursors.Default
            MsgBox(ex.Message)
        End Try
    End Sub
 
    Private Sub BTN_Crear_Click(sender As Object, e As EventArgs) Handles BTN_Crear.Click
        Try
            Me.Cursor = Cursors.WaitCursor
            Dim Filename As String
            get_servername = CMB_ServerName.Text.Trim
            get_userid = TEX_User.Text.Trim
            get_password = TEX_Password.Text.Trim
            Database = CMB_DataBaseName.Text
            If CMB_Autenticacion.SelectedIndex = 0 Then
                constr = "Data Source=" & get_servername & ";Initial Catalog=" & CMB_DataBaseName.Text & ";Integrated Security=True"
            Else
                constr = "Data Source=" & get_servername & ";Initial Catalog=" & CMB_DataBaseName.Text & ";user id=" & get_userid & ";password=" & get_password & ";Integrated Security=False"
                cnn = New SqlConnection(constr)
                cnn.Open()
                Dim StrQuery As String
                SaveFileDialog1.FileName = Database
                SaveFileDialog1.ShowDialog()
                Filename = SaveFileDialog1.FileName
                StrQuery = "backup database" & Database & "to disk='" & Filename & "'"
                Try
                    Cmd = New SqlCommand(StrQuery, cnn)
                    dataaffector = Cmd.ExecuteNonQuery
                    MessageBox.Show("El backup se hizo", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Me.Cursor = Cursors.Default
                Catch ex As Exception
                    Me.Cursor = Cursors.Default
                    MsgBox(ex.Message)
                    Exit Sub
                End Try
                Me.Cursor = Cursors.Default
            End If
            Me.Cursor = Cursors.Default
        Catch ex As Exception
       MsgBox(ex.Message)
        End Try
    End Sub
 
    Private Sub CMB_Autenticacion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CMB_Autenticacion.SelectedIndexChanged
        If CMB_Autenticacion.SelectedIndex = 0 Then
            TEX_Password.Enabled = False
            TEX_User.Enabled = False
            TEX_Password.Text = Nothing
            TEX_User.Text = Nothing
        Else
            TEX_Password.Enabled = True
            TEX_User.Enabled = True
            TEX_Password.Text = Nothing
            TEX_User.Text = Nothing
        End If
    End Sub
End Class

Este código me recupera las bases de datos en el servidor, me carga los usuarios pero al apretar el botón "crear" no pasa nada de nada, ni siquiera me tira mensaje de error. Ni siquiera abre el cuadro de diálogo, es como que se interrumpe antes. Fue el 3ero que probé si no recuerdo mal, como los otros me tiraban error asumí que sería todo por lo mismo.

De paso aprovecho para contarte que he implementado como me sugeriste con otra pregunta los triggers para que me "copien" la fila que voy a editar/borrar, para auditar mis tablas. Y también añadí los login y demás así que ahí voy, paso a paso siguiendo tus sugerencias. Infinitas gracias!

Edité para añadir que mi servidor está con autenticación de windows, pero como el código original contemplaba las dos opciones, lo incluí. Seré yo la única usuaria e inicio a windows con contraseña, así que dejé la autenticación de windows porque entendí por lo que leí que era más segura que emplear la de SQL, ya que Windows emplea protocolos de seguridad más seguros, valga la redundancia (si llegué a una mala conclusión, te pido me corrijas)
Por otro lado, el tema del backup lo tengo re verde, sé qué necesito pero voy paso a paso probando (debo encriptarlo, hacerlo completo, diferencial y transaccional) pero vamos pasito a pasito aprendiendo. Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.468
Plata
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Backup de base de datos SQL desde aplicación en Visual.net

Publicado por Wilfredo Patricio Castillo (635 intervenciones) el 21/08/2018 06:16:47
Hola María Inés.

Pues yo creo que vas muy bien.

El tema que tienes por ahora como inconveniente es que SQL Server Express, no tiene el Agente SQL, lo cual no permite programar Backups en automático.

Se puede hacer mediante programación pero un poco diferente, los ejemplos que has seguido, son para ediciones estandar hacia arriba.

Te dejo unos links con ejemplos para SQL Server Express.

https://blogs.msdn.microsoft.com/sqlexpress/2007/03/20/backup-and-restore-with-user-instances/

--Este otro de temas mas avanzandos, pero no creo que sea para Express, pero te puede dar una idea de lo que quieres hacer.
https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/tasks/backing-up-and-restoring-databases-and-transaction-logs?view=sql-server-2017

---Otro
http://www.politecnia.net/publicaciones/ver/105/Crear-aplicacion-con-Visual-Basic-NET-para-respaldar-bases-de-datos-SQL-Server

--Este es para Express

http://www.jmelosegui.com/blog/2010/04/15/AutomatizandoCopiasDeSeguridadEnSQLServerExpress.aspx

---Este también, pero dale una leída a los comentario, y en vez de programar una tarea, solo genera el store procedure y lo ejecutas desde tu aplicación y le pasas los parámetros que sean necesarios.

https://www.jasoft.org/Blog/post/SQL-Server-Express-Hacer-backups-programados-y-con-retencion.aspx

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 93
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Backup de base de datos SQL desde aplicación en Visual.net

Publicado por María Inés (49 intervenciones) el 21/08/2018 15:07:05
Millón de gracias Wilfredo, una vez más, sos muy generoso! Gracias por tu tiempo, compartir tu conocimiento y buscarme tanto material. Ya lo dice el dicho cuando uno no sabe lo que busca, no entiende lo que encuentra, y es verdad. Todos tus aportes me han sido de gran valía, fui construyendo esta pequeña aplicación para mi uso que me ahorrará muchísimo tiempo. Me voy a poner a estudiar todo lo que me pasaste, sin duda, tienes una amiga en Argentina! Mi gratitud y respetos

María Inés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar