Buenas en este post voy a empezar a fondo con el tema de las bases de datos locales en
.NET y en Java. Primero voy a tratar cómo utilizar bases de datos locales en
aplicaciones de escritorio de Windows Forms en .NET y en el siguiente post
trataré lo mismo pero con WPF y en siguientes empezaré con bases de datos
tanto situadas en servidores como locales a las que nuestra aplicación se conectará.
Idea clara: vamos a crear
aplicaciones con bases de datos locales. Instalo la aplicación en un ordenador y ésta
accederá a su base de datos local. Otra alternativa
sería usar SQL Server o MySQL como proveedor de bases de datos y entonces
tendríamos una o varias aplicaciones clientes que se conectarían a un servidor
donde estarían almacenados los datos y trabajarían con ellos. En ambos tipos de
aplicaciones el acceso a los datos se puede hacer de forma conectada (es decir
crear conexión, crear comando, abrir conexión, ejecutar comando, cerrar
conexión, etc… En pocas palabras si por lo que sea se corta la conexión con la
base de datos en cualquier momento la aplicación fallará) o de forma desconectada
(trabajar con datasets y dataadapters, es decir, tenemos una copia en memoria
de nuestros datos en el dataset con los que trabajaremos y el dataadapter será
el encargado se sincronizar la copia en memoria con los datos de la base datos
cuando se requiera).
En el vídeo que voy a
colgar voy a explicar cómo crear, configurar y publicar varios proyectos de
aplicaciones para Windows Forms que usan bases de datos locales y me voy a
centrar en las dos más conocidas: Access y SQLCompact. Para usar una base de
datos Access la tenemos que crear primero ya sea en Access directamente y
añadirla al proyecto. El IDE ajudará en el proceso de agregar un nuevo
origen de datos a nuestro proyecto.
Pues bien aquí viene la
chicha, porque de conectarse a una base de datos en .NET hay mil y un post, pero…
qué pasa si quiero ocultar la contraseña de la base de datos que usará mi
aplicación y que por defecto, y atendiendo a las buenas prácticas de
programación, se me guardará en el archivo app.config o en
[NombreDeMiAplicación].vshost.exe que se genera en la carpeta bin/Debug o
bin/Release una vez compilemos el proyecto, y añadirla en tiempo de ejecución.
Normalmente los usuarios
finales de las aplicaciones no sabrán que en ese archivo estará el id y el password de
la base de datos pero es bueno no jugársela. ¿Cuál es la solución que podemos
usar para que esa información esté oculta? Pues la mejor es encriptar la cadena de conexión y otra información sensible en el
archivo app.config.
Pues bien la pregunta
ahora es cómo la desencripto en tiempo de ejecución. Bueno dependerá del
tipo proyecto. Si el proyecto que tienes es el tipo proyecto que creas tú desde cero sin usar ningún asistente, pues en el método que crees para recuperar la cadena de conexión podrás aprovechar para desencriptarla y ya la podrás usar. El código sería similar a éste de aquí:
Private _cadenaConexion As String
Private _factory As DbProviderFactory = Nothing
Private Sub ConfigurarAcceso()
Try
Dim proveedor As String = ConfigurationManager.ConnectionStrings("BaseConnectionString").ProviderName
Me._cadenaConexion = ConfigurationManager.ConnectionStrings("BaseConnectionString").ConnectionString
'Aquí iría el código para desencriptar los datos de la cadena de conexión
Me._cadenaConexion = …
Me._factory = DbProviderFactories.GetFactory(proveedor)
Catch ex As ConfigurationErrorsException
Throw New MiBaseDatosException("Error al acceder a la configuración del acceso a datos.", ex)
End Try
End Sub
Pero qué es lo que pasa cuando has creado un proyecto para Windows Forms y has usado el asistente para que te cree un dataset y un dataadapter y te das cuenta que si ejecutas el proyecto no funciona porque la cadena de conexión está encriptada o le falta añadir la contraseña como en el ejemplo que pongo. Pues nada verás si abres el dataset con el diseñador y haces click en el TableAdapter la cadena de conexión la recoge no del archivo app.config sino de My.Settings
Private _factory As DbProviderFactory = Nothing
Private Sub ConfigurarAcceso()
Try
Dim proveedor As String = ConfigurationManager.ConnectionStrings("BaseConnectionString").ProviderName
Me._cadenaConexion = ConfigurationManager.ConnectionStrings("BaseConnectionString").ConnectionString
'Aquí iría el código para desencriptar los datos de la cadena de conexión
Me._cadenaConexion = …
Me._factory = DbProviderFactories.GetFactory(proveedor)
Catch ex As ConfigurationErrorsException
Throw New MiBaseDatosException("Error al acceder a la configuración del acceso a datos.", ex)
End Try
End Sub
Pero qué es lo que pasa cuando has creado un proyecto para Windows Forms y has usado el asistente para que te cree un dataset y un dataadapter y te das cuenta que si ejecutas el proyecto no funciona porque la cadena de conexión está encriptada o le falta añadir la contraseña como en el ejemplo que pongo. Pues nada verás si abres el dataset con el diseñador y haces click en el TableAdapter la cadena de conexión la recoge no del archivo app.config sino de My.Settings
Pues bien podríamos ser
chapuceros y borrar el nodo del archivo app.config
y más feliz que una pediz o podríamos
usar las buenas prácticas y ejemplo encriptar esa sección del app.config o
eliminar la contraseña. Luego vamos a nuestro proyecto y hacemos click con el
botón derecho para ver las propiedades en “Configuración” “Ver Código” y podemos pegar un código como
este para añadir el password a la cadena de conexión:
Partial Friend NotInheritable Class MySettings
Default Public Overrides Property Item(ByVal propertyName As String) As Object
Get
If propertyName = "BaseConnectionString" Then
Return MyBase.Item(propertyName) & ";Jet OLEDB:Database Password=admin;"
End If
Return MyBase.Item(propertyName)
End Get
Set(ByVal value As Object)
MyBase.Item(propertyName) = value
End Set
End Property
End Class
Por último qué pasa si usamos Entity FrameWork y queremos desencriptar la cadena de conexión o añadir la contraseña a la cadena de conexión que aparece en nuestro archivo app.config. Verás que aquí como puedo no usaré Access sino SQLCompact como base de datos.
Default Public Overrides Property Item(ByVal propertyName As String) As Object
Get
If propertyName = "BaseConnectionString" Then
Return MyBase.Item(propertyName) & ";Jet OLEDB:Database Password=admin;"
End If
Return MyBase.Item(propertyName)
End Get
Set(ByVal value As Object)
MyBase.Item(propertyName) = value
End Set
End Property
End Class
Por último qué pasa si usamos Entity FrameWork y queremos desencriptar la cadena de conexión o añadir la contraseña a la cadena de conexión que aparece en nuestro archivo app.config. Verás que aquí como puedo no usaré Access sino SQLCompact como base de datos.
Pues una de las tantas
maneras es crear una función que me devolverá la conexión ya desencriptada o
con la contraseña en nuestro caso:
Private Function getConnection(name As String) As String
Dim connectionString = ConfigurationManager.ConnectionStrings(name).ConnectionString
Dim builder = New EntityConnectionStringBuilder(connectionString)
builder.ProviderConnectionString = builder.ProviderConnectionString & ";Password=estrella;"
Return builder.ToString()
End Function
Y luego ya en el código al crear una nueva instancia de nuestra entidad pues usamos una de las sobrecargas del método constructor que me permitirá pasarle ya cadena de conexión ya lista para usar (porque me la ha devuelto la función getConnection que hemos creado antes.
Private Function getConnection(name As String) As String
Dim connectionString = ConfigurationManager.ConnectionStrings(name).ConnectionString
Dim builder = New EntityConnectionStringBuilder(connectionString)
builder.ProviderConnectionString = builder.ProviderConnectionString & ";Password=estrella;"
Return builder.ToString()
End Function
Y luego ya en el código al crear una nueva instancia de nuestra entidad pues usamos una de las sobrecargas del método constructor que me permitirá pasarle ya cadena de conexión ya lista para usar (porque me la ha devuelto la función getConnection que hemos creado antes.
Dim db As New baseEntities(getConnection("baseEntities"))
Pues bien en el siguiente
vídeo voy a concretar todos estos temas ya que hay amplio contenido.En el siguiente post continuaré con acceso a bases de datos locales en WPF, que proporcinará unas interfaces mucho más modernas para nuestras aplicaciones y entonces entraremos al mundo de las bases locales en Java usando Hibernate y JPA. Tengo pensado desarrollar otra aplicación en Java para hacer facturas y listar datos. Quiero desarrollar la típica aplicación de facturación en Java y luego desarrollar alguna que otra aplicación contable así útil que me quite trabajo.
No hay comentarios:
Publicar un comentario