martes, 12 de mayo de 2009

JDBC para Access sin DSN

Para acceder a Access desde un JDBC, siempre nos han enseñado que se debe a Herramientas Administrativas > Administrador de Orígines de ODBC, crear un nuevo Origen, especificar el nombre del DNS, bla bla bla, y después desde el JDBC escribir como URL el nombre del DNS, bla bla.
Lo malo de esta técnica es que en cada máquina donde se va a ejecutar la aplicación java, necesita que se configure el ODBC. Ya que somos profesionales, debemos evitar las configuraciones adicionales para que nuestra aplicación funcione.

Java nos hace profesionales :)

Así que, ahora evitaremos todo el rollo de crear el DSN en el ODBC. Usemos esto:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String myDB ="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/data/neptuno.MDB";
Connection conn = DriverManager.getConnection(myDB,"","");
Pero no solo es para Access, sino para cualquier ODBC. Veamos como hacer lo mismo pero para con el Excel

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String myDB = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=c:/data.xls;"
+ "DriverID=22;READONLY=false";
Connection conn=DriverManager.getConnection(myDB,"","");


18 comentarios:

  1. Hola Buenas he estado buscando información para poder conectarme a una bbdd en acces sin tener que configurar DNS, ya que el programa cuando lo instale en otro ordenador no quiero tener que hacer nada. Bueno el problema es que este codigo me da un error y no se por que te lo comento por si sabes algo del tema.
    El error es este:
    [Microsoft][Controlador ODBC Microsoft Access] No se pudo encontrar el archivo '(desconocido)'.


    Te puedo asegurar que el archivo existe.
    Gracias

    ResponderEliminar
  2. Trata de configurar un DSN de ODBC en ese computador.
    Luego, asegúrate que esté bien escrito el DSN del Java, revisa los "/" que estén en lugar de los "\"

    ResponderEliminar
  3. y como seria en el caso de DSN para MySql¿?

    ResponderEliminar
  4. ¿Conectar desde Java a MySQL usando ODBC?
    Para hacerlo se utiliza un driver JDBC (Java Database Connect). MySQL tiene el suyo

    >http://dev.mysql.com/downloads/connector/j/

    Para usarlo, lee su manual:

    http://dev.mysql.com/doc/refman/5.1/en/connector-j.html

    ResponderEliminar
  5. hola... estoy siguiendo este tutorial (de gran ayuda gracias :D) pero me encuentro con un problema al seleccionar un rango de la hoja excel (con la siguiente query "SELECT * FROM [Sheet1$a1:c3]") ya que dependiendo del nombre de la hoja funciona o no. ¿Sabrás cual puede ser el problema?
    INFO: Al ejecutar sin el rango me muestra el problema: [Error Code: -1002, SQL State: 37000] [Microsoft][Controlador ODBC Excel] Corchetes no válidos en el nombre ' a d$'. Lo que me indica que si entrecomillo el nombre de la hoja dentro de los corchetes (['nombre']) funciona... pero usando este entrecomillado parece que no se puede seleccionar el rango...
    Un Saludo y gracias por atenderme

    ResponderEliminar
  6. Hola
    intenta ponerle un nombre a ese rango, y llámalo usando ese nombre.

    ResponderEliminar
  7. Gracias por la contestación ... pero no me interesaría tener que nombrar el rango desde el Excel... a menos que se pudiese hacer desde el código... que creo que no.
    Gracias y un Saludo.

    ResponderEliminar
  8. Hola, gracias por las lineas de codigo, pero tengo una pregunta, estoy usando JPA, y no se como conectarme a mi base de datos, uso Access. ¿Alguna idea?

    ResponderEliminar
  9. En desktop, estoy haciendo una aplicación básica de toma de contacto con JPA, es decir, estoy empezando a trabajar con JPA jeje.

    ResponderEliminar
  10. Para acceder a Access se necesita de un ODBC, y este no es JDBC nativo, por tanto no es tan fácil hacerlo. Recomiendo siempre usar un JDBC nativo de categoría 4 (Es decir, nada de ODBC). Por ejemplo MySQL, ApacheDB, PostgreSQL, MS SQL, etc... casi todos los motores de base de datos tienen su JDBC.

    ResponderEliminar
  11. Gracias por tu ayuda, pero en el pc donde estoy trabajando, SOLO puedo hacerlo con Acces, he probado a hacer la conexion tipica de JDBC, crearConexion, cargarDriver y eso. Al ejecutar me da exepcion en esta línea:
    EntityManager em = factory.createEntityManager();
    Y en consola me aparece esto:

    [EL Info]: 2010-08-11 09:33:21.715--ServerSession(2693887)--property eclipselink.jdbc.user is deprecated, property javax.persistence.jdbc.user should be used instead.
    [EL Info]: 2010-08-11 09:33:21.755--ServerSession(2693887)--property eclipselink.jdbc.driver is deprecated, property javax.persistence.jdbc.driver should be used instead.
    [EL Info]: 2010-08-11 09:33:21.755--ServerSession(2693887)--property eclipselink.jdbc.url is deprecated, property javax.persistence.jdbc.url should be used instead.
    [EL Info]: 2010-08-11 09:33:21.755--ServerSession(2693887)--property eclipselink.jdbc.password is deprecated, property javax.persistence.jdbc.password should be used instead.
    [EL Info]: 2010-08-11 09:33:23.791--ServerSession(2693887)--property eclipselink.jdbc.user is deprecated, property javax.persistence.jdbc.user should be used instead.
    [EL Info]: 2010-08-11 09:33:23.791--ServerSession(2693887)--property eclipselink.jdbc.driver is deprecated, property javax.persistence.jdbc.driver should be used instead.
    [EL Info]: 2010-08-11 09:33:23.791--ServerSession(2693887)--property eclipselink.jdbc.url is deprecated, property javax.persistence.jdbc.url should be used instead.
    [EL Info]: 2010-08-11 09:33:23.801--ServerSession(2693887)--property eclipselink.jdbc.password is deprecated, property javax.persistence.jdbc.password should be used instead.
    [EL Info]: 2010-08-11 09:33:25.467--ServerSession(2693887)--EclipseLink, version: Eclipse Persistence Services - 2.1.0.v20100614-r7608
    [EL Severe]: 2010-08-11 09:33:25.477--ServerSession(2693887)--Local Exception Stack:
    Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DatabaseException
    Exception Description: Configuration error. Class [] not found.
    at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
    at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
    at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
    at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:579)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:380)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:157)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:214)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:202)

    No se que hacer, la verdad que mi ejemplo es bastante tonto, tengo una clase alumno, con nombre,etc.. y lo que quiero es mediante unos sets, persistir el objeto alumno y que me lo cree en la base de datos..

    Gracias

    ResponderEliminar
  12. El error que te dice exactamente es este:

    Exception Description: Configuration error. Class [] not found.

    Clase [] (¿cual clase?) no se encontró.

    Revisa qué clases estás utilizando para hacer tu JPA. Asegúrate que diga "sun.jdbc.odbc.JdbcOdbcDriver"

    ResponderEliminar
  13. buenas diego, te dejo mi mail, no consigo arreglarlo, un saludo.

    alexinhoR@hotmail.com

    ResponderEliminar
  14. yo recientemente he iniciado la programación en java y para conectarme a java era un problema con los odbc estaba cerca de hacerlo y ley en el articulo y estaba cerca , ahora necesito conectarme a openoffice pueden ayudarme????

    ResponderEliminar
  15. OpenOffice Base utiliza internamente la base de datos HSQLDB. Aquí hay un post explicando como funciona.

    http://www.apuntesdejava.com/2009/01/base-de-datos-relacionales-en-java.html

    ¿Pero conectar desde Java al Base usando ese driver?.. pregunta interesante... voy a revisar.

    ResponderEliminar
  16. HOLA QUISIERA SABER COMO GENERAR EL CODIGO PARA SQL SERVER POR FAVOR SERIAN TAN AMABLES DE AYUDARME Y DARME UNOS POCOS PARAMETROS DE CONFIGURACION POR QUE NO CONECTA ADEMAS QUE GENERE UNA APLICACION JAR Y LA VERDAD NO FUNCIONA OSEA NO ME ABRE TENGO INSTALDO TODO PERO AL TENER TB INSTALADO EL OVI DE NOKIS ME APARECIA COMO UNA APLICACION JAVA PARA TELEFONO MOVIL Y NO UNA APLICACION JAR PARA COMPUTADOR ALGUIEN SABE COMO CONFIGURAR ESTO POR FAVOR TENGO WINDOWS 7 POR ESO ES LA CONFUSION EN WINDOWS XP NUNCA TUBE PROBLEMA!!!

    ResponderEliminar
  17. Hola muchas gracias por el post disculpa, dos preguntas 1: ¿que versiones de access soporta esas instrucciones?, 2: ¿El DSN debe estar limpio o aunque tenga una DB ya alojada funciona.

    ResponderEliminar

Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups


Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/