java - microsoft - Conexión del controlador JDBC ODBC
sqljdbc4-4.0.jar download (2)
Actualmente estoy trabajando en un proyecto para una clase en mi Universidad. Estoy aprendiendo a conectar y manipular bases de datos y estamos usando un archivo .accdb de Microsoft.
Esto es lo que tengo hasta ahora.
/* Perform database operations */
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("Driver loaded");
connection = DriverManager.getConnection("jdbc:odbc:Lab3.accdb");
System.out.println("Database connected");
statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("");
while (resultSet.next()) {
output.write("<p>" + resultSet.getString(1) + "/t" +
resultSet.getString(2) + "/t" + resultSet.getString(3) + "</p>");
}
connection.close();
} catch (ClassNotFoundException|SQLException e) {
System.out.println("Database Access Error.");
e.printStackTrace();
}
Cuando busco "sun.jdbc.odbc.JdbcOdbcDriver" obtengo el siguiente resultado.
SEVERE: java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1761)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1611)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at changepass.ChangePasswordServlet.processRequest(ChangePasswordServlet.java:47)
at changepass.ChangePasswordServlet.doGet(ChangePasswordServlet.java:83)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:744)
Parece lo suficientemente simple para trabajar. Parece que me estoy perdiendo el controlador o algo por el estilo. Sin embargo, estoy teniendo dificultades para descubrir qué hacer con esto. ¿El controlador está incluido con el JDK en algún lugar? ¿Debo descargar algo por separado? ¿Depende de mi sistema operativo? (Mac OS X 10.9). ¿O simplemente estoy haciendo algo mal en el código?
¡Apreciaría la ayuda! ¡Gracias!
Información adicional:
[James@toodarkpark: ~]$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
[James@toodarkpark: ~]$
No funcionó con ODBC-Bridge para mí también. Obtuve el camino para inicializar la conexión ODBC utilizando el controlador ODBC.
import java.sql.*;
public class UserLogin
{
public static void main(String[] args)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// C://databaseFileName.accdb" - location of your database
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + "C://emp.accdb";
// specify url, username, pasword - make sure these are valid
Connection conn = DriverManager.getConnection(url, "username", "password");
System.out.println("Connection Succesfull");
}
catch (Exception e)
{
System.err.println("Got an exception! ");
System.err.println(e.getMessage());
}
}
}
Como se menciona en los comentarios a la pregunta, el puente JDBC-ODBC es, como su nombre indica, solo un mecanismo para que la capa JDBC "hable" con la capa ODBC. Incluso si tuviera un puente JDBC-ODBC en su Mac, también necesitaría tener
- una implementación de ODBC en sí misma, y
- un controlador ODBC apropiado para la base de datos de destino (ACE / Jet, también conocido como "Acceso")
Entonces, para la mayoría de las personas, usar la tecnología JDBC-ODBC Bridge para manipular bases de datos ACE / Jet ("Acceso") es realmente una opción práctica solo bajo Windows. También es importante tener en cuenta que el puente JDBC-ODBC se habrá eliminado en Java 8 (ref: aquí ).
Existen otras maneras de manipular bases de datos ACE / Jet desde Java, como UCanAccess y Jackcess . Ambas son implementaciones de Java puro, por lo que funcionan en plataformas que no son de Windows. Para detalles sobre cómo usar UCanAccess vea
Manipular una base de datos de Access desde Java sin ODBC