2011-02-16 10 views
6

Estoy construyendo una aplicación de escritorio que necesita comunicarse con una base de datos de MS Access. Ahora, a menos que quiera registrar el DSN para la base de datos en cada computadora que vaya a usar la aplicación de escritorio, necesito una manera de conectarme a la base de datos sin DSN.Creando una conexión sin DSN para MS Access dentro de Java

He buscado mucho y he encontrado algunos enlaces útiles en how to create connection strings y en función de eso he intentado modificar mi programa basado en eso, pero sin éxito. El código siguiente falla. Si cambio la cadena en getConnection a "jdbc: odbc: sampleDB", funciona, pero eso es usar DSN y no lo que quiero lograr.

¿Cómo escribo y uso una cadena de conexión en java para hacer una conexión sin DSN a una base de datos de MS Access?

private Connection setupConnection() throws ClassNotFoundException, 
     SQLException { 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection con = DriverManager.getConnection("Driver={Microsoft Access Driver (*.mdb)} &_ Dbq=c:\\as\\sampleDB.mdb"); 
    return con; 
} 

Adición: También me gustaría señalar que si alguien tiene una idea de una forma de lograr lo que pedí con una conexión DSN-mucho gusto voy a escuchar a él!

Respuesta

5

cadena de conexión JDBC shouls empezar con jdbc: como:

jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Nwind.mdb 

a fin de tratar con:

Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\\as\\sampleDB.mdb"); 

Si configura DSN, entonces puede conectarse a él utilizando más simple cadena de conexión: jdbc:odbc:[alias], ejemplo:

jdbc:odbc:northwind 
+0

Funcionó como un amuleto. ¡Muchas gracias! –

+0

Trabajó para [tablas relacionadas con la base de datos h2] (http://www.h2database.com/html/grammar.html#create_linked_table), también. – transistor1

1

También tuve este problema e intenté hombre y de las sugerencias aquí y en varios foros. Finalmente, descubrí un fragmento de un lugar que me llevó a conectarme con éxito y también explica por qué muchas de estas publicaciones no funcionan. Consulte http://www.coderanch.com/t/295299/JDBC/databases/jdbc-odbc-DSN-connection-MS

El problema es que debe haber un punto y coma después de dos puntos al final de odbc como en jdbc: odbc:; Driver =. Esto tuvo sentido después de leer la documentación de Oracle en el puente JdbcOdbc que establece que la sintaxis es jdbc: odbc: dsn; atributos ....... Dado que no estamos suministrando un DSN, entonces necesitamos terminar con; antes de agregar atributos.

estoy mostrando a continuación las pruebas me encontré con diferentes cadenas de conexión en una máquina de 32 bits de Windows 7 Ultimate:

 driver= (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 
     //jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ= does lookup to ODBC.ini to find matching driver 


      try { 
      connstr= "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn= DriverManager.getConnection(connstr, "", ""); 
      stmt= conn.createStatement(); 
     } 
     catch (Exception e){} 
     try { 
      connstr= "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn1= DriverManager.getConnection(connstr, "", ""); 
      stmt1= conn1.createStatement(); 
      dbmeta1=conn1.getMetaData(); 
     } 
     catch (Exception e){} 
     try { 
      connstr= "jdbc:odbc:MS Access Database;DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn2= DriverManager.getConnection(connstr, "", ""); 
      stmt2= conn2.createStatement(); 
      dbmeta2=conn2.getMetaData(); 
     } 
     catch (Exception e){} 
     try { 
      connstr= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileURI; //64 bit ?? (*.mdb,*.accdb) 
      conn3= DriverManager.getConnection(connstr, "", ""); 
      stmt3= conn3.createStatement(); 
      dbmeta3=conn3.getMetaData(); 
     } 
     catch (Exception e){} 

instr1 y stmt3 son nulos ya que las conexiones son nulos. stmt y stmt2 funcionan. stmt2 usa una cadena de conexión que encontré en la documentación de IBM Tivoli. Funciona porque "MS Access Database" es un título válido en el registro ODBC como un DSN de usuario en mi computadora.

+0

¡GRACIAS! Estaba tan frustrado, buscando una cadena de conexión adecuada. El tercero trabajó para mí. – Jazz

Cuestiones relacionadas