Principales respuestas
la cadena de conexión no me reconoce la constraseña encriptada de la misma.

Pregunta
-
Hola a todos:
Tengo el problema de que no me reconoce el password la cadena de conexión.
Estoy trabajando con una factoría de proveedores.
El proceso se crea en la clase "Configuración" que os la adjunto:
Option Explicit On Option Strict On Imports System.Data.Common Imports System.Configuration Public Class Configuracion ''' <summary> ''' Clase para obtener el proveedor de datos y la cadena ''' de conexión de acuerdo con el nombre de una cadena de ''' conexión existente en el archivo de configuración de ''' la aplicación. ''' </summary> ''' <author>Enrique Martínez Montejo - 2010</author> Public Shared Property strNombreBaseDeDatos As String Private m_connString As String Private m_name As String Private m_providerName As String Private PasswordEncriptado As String ''' <summary> ''' Crea una nueva instancia de la clase ApplicationConfig ''' con el nombre de la cadena de conexión existente en el ''' archivo de configuración de la aplicación. ''' </summary> ''' <param name="nameConnectionString">Nombre de la cadena de conexión.</param> ''' Public Sub New(nameConnectionString As String) nameConnectionString = strNombreBaseDeDatos ' Obtenemos el archivo de configuración de la aplicación. Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) ' Devolvemos la cadena de conexión que se corresponda con el nombre especificado. Dim cs As ConnectionStringSettings = config.ConnectionStrings.ConnectionStrings(nameConnectionString) If (cs Is Nothing) Then Throw New ArgumentException("El nombre de la cadena de conexión no existe en el archivo de configuración de la aplicación.") End If m_connString = cs.ConnectionString() If (m_connString = String.Empty) Then Throw New ArgumentException("No existe la cadena de conexión en el valor con nombre especificado.") End If m_providerName = cs.ProviderName If (m_providerName = String.Empty) Then Throw New ArgumentException("El proveedor .net especificado actualmente no se encuentra soportado.") End If m_name = cs.Name ' También se puede obtener la cadena de conexión de alguna de las siguientes maneras ' ' Return ConfigurationManager.ConnectionStrings(name).ConnectionString End Sub ''' <summary> ''' Devuelve la cadena de conexión existente en el ''' archivo de configuración de la aplicación. ''' </summary> Public Property ConnectionString As String Get Return m_connString End Get Set(value As String) End Set End Property ''' <summary> ''' Devuelve el nombre de la cadena de conexión utilizada. ''' </summary> Public Property Name As String Get Return m_name End Get Set(value As String) End Set End Property ''' <summary> ''' Devuelve el proveedor de datos utilizado en la ''' cadena de conexión existente en el archivo de ''' configuración de la aplicación. ''' </summary> Public Property ProviderName As String Get Return m_providerName End Get Set(value As String) End Set End Property Public Shared Function CreateParameter(cmd As DbCommand, name As String, value As Object) As DbParameter If (cmd Is Nothing) Then Throw New ArgumentException("El valor del comando no es válido.") End If Dim param As DbParameter = cmd.CreateParameter() param.ParameterName = name param.Value = value Return param End Function Public Shared Function CadenaConexion() As String Try If Configuracion.strNombreBaseDeDatos = "MiCadenaConexion" Then Dim cnx As String = ConfigurationManager.ConnectionStrings("MiCadenaConexion").ConnectionString Dim PasswordEncriptado As String = System.Text.Encoding.Default.GetString(System.Convert.FromBase64String("XXXXX")) Return cnx & PasswordEncriptado ElseIf Configuracion.strNombreBaseDeDatos = "PerseoSqlEx" Then Dim cnx As String = ConfigurationManager.ConnectionStrings("PerseoSqlEx").ConnectionString Return cnx ElseIf Configuracion.strNombreBaseDeDatos = "PerseoSQLce" Then Dim cnx As String = ConfigurationManager.ConnectionStrings("PerseoSQLce").ConnectionString Return cnx 'ElseIf Configuracion.strNombreBaseDeDatos = "PerseoMySQL" Then ' Dim cnx As String = ConfigurationManager.ConnectionStrings("PerseoMySQL").ConnectionString ' Return cnx 'ElseIf Configuracion.strNombreBaseDeDatos = "PerseoSQLite" Then ' Dim cnx As String = ConfigurationManager.ConnectionStrings("PerseoSQLite").ConnectionString ' Return cnx Else Return "" End If Catch exc As Exception Throw 'exc End Try End Function
Cuando llamo al procedimiento de la función anterior "CadenaConexion" desde otro procedimiento como el adjunto, no me renococe el password y me da error de "No es una contraseña válida". Es decir, solo por lo que veo al pasar por el procedimiento que la connectionstring, únicamente lleva esto:"Provider=Microsoft.ACE.OLEDB.12.0;Data Source = |DataDirectory|\gemmafin.accdb" pero no muestra el password por eso se que de qwue la contraseña no es válida, porque no la lleva o no la ve.
Public Shared Sub TIPO_VERSION() ' Creamos el acceso a datos mediante el nombre de la cadena de conexión existente en el archivo de configuración de la aplicación. Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(Configuracion.CadenaConexion) Dim valor As Integer = AccesoLogica.ObtenerPeriodos() ' Declaramos una variable Connection Using cnn As DbConnection = da.CreateConnection() ' Creamos el Commando Dim cmd As DbCommand = cnn.CreateCommand() cnn.Open() .../....
También hago referencia que el password que no figura ya en la cadena de conexión es el siguiente: ;Jet OLEDB:Database Password=xxxxxxx, que evidentemente es el mismo que figuraba en la cadena pero con comillas.
Bueno el problema es que no veo como solucionar el tema de que reconozca la contraseña y además no entiendo que en la cadena de conexión se la estoy dando.
En fin, muchas gracias a todos como siempre.
Gemma
- Editado gemma_campillo viernes, 8 de julio de 2016 11:19
- Editado Enrique M. MontejoModerator domingo, 10 de julio de 2016 11:23 Eliminar cadena en base 64 con la contraseña de la base de datos.
Respuestas
-
Hola:
Lo he solucionado añadiendo a una variable m_connectionstring el valor del password. : System.Text.Encoding.Default.GetString(System.Convert.FromBase64String("XXXXX"))
Dicho valor lo he añadido en la clase DataAccessInvariant:
''' <summary> ''' Crea una nueva instancia de la clase con el nombre ''' invariable de un proveedor de datos. ''' </summary> ''' <param name="providerInvariantName">Nombre invariable de ''' un proveedor, como por ejemplo System.Data.SqlClient.</param> ''' <param name="connectionString">Cadena de conexión con el origen de datos.</param> ''' <remarks></remarks> Public Sub New(providerInvariantName As String, connectionString As String) ' Antes que el método GetFactory de la clase DbProviderFactories genere ' la excepción, la generamos nosotros mismos para personalizar el mensaje ' de la excepción. ' If (String.IsNullOrWhiteSpace(providerInvariantName)) Then Throw New ArgumentException("No se ha especificado el nombre del proveedor de datos.") End If m_connectionString = connectionString & System.Text.Encoding.Default.GetString(System.Convert.FromBase64String("XXXXX")) m_providerInvariantName = providerInvariantName ' Creamos la factoría. Se distingue entre mayúsculas y minúsculas. ' m_factory = DbProviderFactories.GetFactory(m_providerInvariantName) End Sub
y ahí se han acabado los problemas, no se si es lo más correcto, pero ahí funciona perfectamente.
Un saludo a todos.
Gemma
- Marcado como respuesta gemma_campillo viernes, 8 de julio de 2016 15:19
- Editado Enrique M. MontejoModerator domingo, 10 de julio de 2016 11:24 Eliminar cadena en base 64 con la contraseña de la base de datos.