none
la cadena de conexión no me reconoce la constraseña encriptada de la misma. RRS feed

  • 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





    viernes, 8 de julio de 2016 11:15

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.
    viernes, 8 de julio de 2016 15:19