none
Consulta sql para acceder a bases de datos access con contraseña

    Pregunta

  • Buenas noches

    Otra vez yo con la preguntadera, pero bueno no he podido soucionar lo siguiente: quiero poder hacer un restore parcial de las bases de datos, entonces quiero pasar los datos solo de algunas tablas para eso utilizo el siguiente codigo:

    sql = "insert into clientes in '" & BDDestino & "' select * from clientes  in '" & BDOrigen & "'"
    cmd.CommandText = sql
    cmd.ExecuteNonQuery()

    El codigo funciona a la perfeccion, el peeeero... esta en que las bases de datos tienen contraseña, supongo que las contraseñas van despues de la base de dato origen y destino, me gustaria saber como exactamente porque he intentado un monton de cosas y nada me ha resultado, gracias de antemano.

    Saludos


    • Editado fertrones0 jueves, 13 de abril de 2017 2:18
    jueves, 13 de abril de 2017 2:17

Respuestas

  • "fertrones0" preguntó:

    > quiero poder hacer un restore parcial de las bases de datos, entonces quiero
    > pasar los datos solo de algunas tablas para eso utilizo el siguiente codigo:
    >
    > sql = "insert into clientes in '" & BDDestino & "' select * from clientes  in '" & BDOrigen & "'"
    >
    > El codigo funciona a la perfeccion, el peeeero... esta en que las bases de datos
    > tienen contraseña, supongo que las contraseñas van despues de la base de dato
    > origen y destino, ...

    Hola:

    No, ninguna de las dos contraseñas van después de la bases de datos de Access de origen y destino, porque la contraseña de la base de datos que va a ejecutar la consulta SQL de datos añadidos (INSERT INTO), la establecerías en la cadena de conexión de la base de datos INTERNA o de origen (la que contiene los datos que deseas exportar), y la de la segunda base de datos la establecerías en la cadena de conexión de la base de datos EXTERNA o de destino (la que va a recibir los datos) tras la cláusula IN.

    Lo primero que observo en la sintaxis de la consulta SQL que has indicado es que existen DOS CLÁUSULA IN, cuando solamente debe de existir una única cláusula IN, que es la que indica la cadena de conexión con la base de datos de destino, por lo que la consulta INSERT INTO correcta sería la que indico a continuación:

        INSERT INTO [Clientes] IN ''[MS ACCESS;DATABASE=C:\Mis documentos\BaseDestino.accdb;PWD=contraseñaDestino] SELECT * FROM [Clientes]

    Vamos a suponer que la ruta de la base de datos de Access de destino (la base de datos externa) es la siguiente:

        C:\Mis documentos\BaseDestino.accdb

    Y la de la ruta de la base de datos de Access de origen (la base de datos interna encargada de ejecutar la consulta INSERT INTO) es esta otra:

        C:\Mis documentos\BaseOrigen.accdb

    Procederías a la exportación de datos de la tabla Clientes ejecutando el siguiente código:

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Establecemos una conexión con la base de datos de origen,
                ' que es la encargada de ejecutar la exportación de datos.
                '
                Dim cadenaConexionOrigen As String =
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Mis documentos\BaseOrigen.accdb;" &
                    "Jet OLEDB:Database Password=contraseñaOrigen"
    
                Using cnn As New OleDbConnection(cadenaConexionOrigen)
    
                    ' Establecemos la cadena de conexión con la base de datos
                    ' de destino, que es la que recibirá los datos, donde su
                    ' contraseña se establecerá en el parámetro PWD.
                    '
                    Dim cadenaConexionDestino As String =
                        "MS ACCESS;DATABASE=C:\Mis documentos\BaseDestino.accdb;PWD=contraseñaDestino"
    
                    ' Crear un comando que ejecutará la consulta SQL
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    ' Configurar el comando
                    cmd.CommandText = String.Format("INSERT INTO [{0}] IN ''[{1}] SELECT * FROM [{2}]", "Clientes", cadenaConexionDestino, "Clientes")
    
                    ' Abrir la conexión
                    cnn.Open()
    
                    ' Ejecutar la consulta
                    Dim n As Integer = cmd.ExecuteNonQuery()
    
                    ' Mostrar el número de registros exportados
                    MessageBox.Show(String.Format("Nº de registros exportados: {0}", n))
                End Using
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si todo ha ido bien se mostrará un mensaje con el número de registros exportados.

    Fíjate cómo he construido la consulta SQL de datos añadidos:

        ' Configurar el comando
        cmd.CommandText = String.Format("INSERT INTO [{0}] IN ''[{1}] SELECT * FROM [{2}]", "Clientes", cadenaConexionDestino, "Clientes")

    Lo he hecho así para que puedas reutilizarla para exportar otros datos existentes en otras tablas diferentes con tan solo modificar el nombre de las tablas que figuran en la consulta, siendo el resultado final el indicado más arriba.

    Observa que solamente hay una cláusula IN, que es la que indica la cadena de conexión completa, incluida su contraseña, con la base de datos de destino.

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    jueves, 13 de abril de 2017 6:01
    Moderador

Todas las respuestas

  • Hola fertrones0

    Cuando dices contraseña te refieres al usuario? entonces deberías colocarlo en cada cadena de conexión de tus dos bases, tanto destino como origen

    "Server=localhost; initial catalog=MyBD; user=nameusuario; password=contrasenia"

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    jueves, 13 de abril de 2017 3:07
  • "fertrones0" preguntó:

    > quiero poder hacer un restore parcial de las bases de datos, entonces quiero
    > pasar los datos solo de algunas tablas para eso utilizo el siguiente codigo:
    >
    > sql = "insert into clientes in '" & BDDestino & "' select * from clientes  in '" & BDOrigen & "'"
    >
    > El codigo funciona a la perfeccion, el peeeero... esta en que las bases de datos
    > tienen contraseña, supongo que las contraseñas van despues de la base de dato
    > origen y destino, ...

    Hola:

    No, ninguna de las dos contraseñas van después de la bases de datos de Access de origen y destino, porque la contraseña de la base de datos que va a ejecutar la consulta SQL de datos añadidos (INSERT INTO), la establecerías en la cadena de conexión de la base de datos INTERNA o de origen (la que contiene los datos que deseas exportar), y la de la segunda base de datos la establecerías en la cadena de conexión de la base de datos EXTERNA o de destino (la que va a recibir los datos) tras la cláusula IN.

    Lo primero que observo en la sintaxis de la consulta SQL que has indicado es que existen DOS CLÁUSULA IN, cuando solamente debe de existir una única cláusula IN, que es la que indica la cadena de conexión con la base de datos de destino, por lo que la consulta INSERT INTO correcta sería la que indico a continuación:

        INSERT INTO [Clientes] IN ''[MS ACCESS;DATABASE=C:\Mis documentos\BaseDestino.accdb;PWD=contraseñaDestino] SELECT * FROM [Clientes]

    Vamos a suponer que la ruta de la base de datos de Access de destino (la base de datos externa) es la siguiente:

        C:\Mis documentos\BaseDestino.accdb

    Y la de la ruta de la base de datos de Access de origen (la base de datos interna encargada de ejecutar la consulta INSERT INTO) es esta otra:

        C:\Mis documentos\BaseOrigen.accdb

    Procederías a la exportación de datos de la tabla Clientes ejecutando el siguiente código:

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Establecemos una conexión con la base de datos de origen,
                ' que es la encargada de ejecutar la exportación de datos.
                '
                Dim cadenaConexionOrigen As String =
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Mis documentos\BaseOrigen.accdb;" &
                    "Jet OLEDB:Database Password=contraseñaOrigen"
    
                Using cnn As New OleDbConnection(cadenaConexionOrigen)
    
                    ' Establecemos la cadena de conexión con la base de datos
                    ' de destino, que es la que recibirá los datos, donde su
                    ' contraseña se establecerá en el parámetro PWD.
                    '
                    Dim cadenaConexionDestino As String =
                        "MS ACCESS;DATABASE=C:\Mis documentos\BaseDestino.accdb;PWD=contraseñaDestino"
    
                    ' Crear un comando que ejecutará la consulta SQL
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    ' Configurar el comando
                    cmd.CommandText = String.Format("INSERT INTO [{0}] IN ''[{1}] SELECT * FROM [{2}]", "Clientes", cadenaConexionDestino, "Clientes")
    
                    ' Abrir la conexión
                    cnn.Open()
    
                    ' Ejecutar la consulta
                    Dim n As Integer = cmd.ExecuteNonQuery()
    
                    ' Mostrar el número de registros exportados
                    MessageBox.Show(String.Format("Nº de registros exportados: {0}", n))
                End Using
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si todo ha ido bien se mostrará un mensaje con el número de registros exportados.

    Fíjate cómo he construido la consulta SQL de datos añadidos:

        ' Configurar el comando
        cmd.CommandText = String.Format("INSERT INTO [{0}] IN ''[{1}] SELECT * FROM [{2}]", "Clientes", cadenaConexionDestino, "Clientes")

    Lo he hecho así para que puedas reutilizarla para exportar otros datos existentes en otras tablas diferentes con tan solo modificar el nombre de las tablas que figuran en la consulta, siendo el resultado final el indicado más arriba.

    Observa que solamente hay una cláusula IN, que es la que indica la cadena de conexión completa, incluida su contraseña, con la base de datos de destino.

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    jueves, 13 de abril de 2017 6:01
    Moderador
  • No Brayan lamento no haber sido claro, la contraseña es una normal que se le coloca a la base de datos en access cuando se crea, entonces cuando se llama a esa base sin conectarse ella para hacer restore de una tabla en especifico, pues claro la pide, de todas formas te agradezco el interes y tu respuesta, saludos
    jueves, 13 de abril de 2017 23:46
  • Hola Enrique muy agradecido con tu respuesta, voy a estudiar detenidamente tu codigo, pero quiero aclararte algo, no se si estoy errado, lo que quiero hacer es un restore de un backup que se hizo, ese restore lo voy a hacer a la base de datos activa la que esta en la conexion, por consiguiente la base que necesita la contraseña es la de origen de donde voy a leer los datos, no la de destino, ahora bien supon que yo quisiera copiar una tabla de una base de datos a otra o los datos de una tabla a otra, cuando ninguna de las dos es la activa y ambas tienen contaseña, como seria en ese caso la consulta sql, te recuerdo que son access, gracias por tu interes, tu respuesta y por la nueva respuesta que de seguro me daras, saludos

    Edito: Lo de los parametros me parece genial porque si sera codigo reutilizado

    • Editado fertrones0 viernes, 14 de abril de 2017 0:01
    viernes, 14 de abril de 2017 0:00
  • Hola Enrique, te cuento que decidi aceptar tu consejo, cree otra conexion e inverti origen-destino en el codigo y listo funciono a la perfeccion, sino se aceptan los consejos de los maestros entonces nunca aprenderemos, te quedo muy agradecido, y gracias tambien por la ñapa de los parametros.

    Saludos

    viernes, 14 de abril de 2017 2:33