entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Buenos días.

He compilado un proyecto con NetBeans 8.0.2 que consiste en realizar la importación de la información
de un archivo de Excel a una base de datos de MS Access. en el IDE se realizan la operacionr de forma exitosa,
sin embargo, al realizar la compilación del código fuente para obtener el ejecutable .jar, aparece la Excepcción
Java.lang.ClassNotFoundException, indicando que no se encuentra el puente de conexión entre
Java y ODBC.

¿Existe alguna configuración del IDE que esté omitiendo que no me permita realizar la conexión?
¿Existe otra alternativa para conectarse con Java y Access?

El código fuente ya verificado en NetBeans es éste:

package Controlador;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class Conexion {

public  static Connection conectar(String xPath) {
    /*Validación de archivo Access*/
    String extensionBD=xPath.substring(xPath.lastIndexOf("."));
    if(extensionBD.equals(".mdb")||extensionBD.equals(".accdb")){

    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + xPath;
        Connection conn = DriverManager.getConnection(url, "", "");

        System.out.println("Conexión Exitosa con la base "+xPath+" (Extensión: "+extensionBD+")"); 
        return conn;
    } catch (SQLException sql) {
        sql.printStackTrace();
        JOptionPane.showMessageDialog(null, "La Base de datos seleccionada está dañada, no es la base de datos del SAEH, "
                + "o no se encuentras los campos necesario para insertar, favor de verificar, ","Aviso de Base de datos",2);
        return null;
}   catch (ClassNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Error de conexión con la Base de datos","Atención BD",0);
        JOptionPane.showMessageDialog(null, ex,"Error",0);
      return null;
    }
    }
    else{
    JOptionPane.showMessageDialog(null, "La extensión "+extensionBD+" no es válida. "
            + "Seleccione un archivo de base de datos válido");
        return null;
    }
}
}

De antemano muchas gracias.

bl4z3r comentado Dic 4, 2015

¿Puedes poner la excepción completa(mensaje, trace, id de error, etc) que te lanza java?

1 Respuesta

2votos

MitsuGami Puntos7990

La excepción ClassNotFoundException se lanza cuando se solicita una clase que no se encuentra en el classpath del proyecto. En tu caso, el compilador no encuentra el driver que contiene esa clase.

Puede deberse a:

  1. Has olvidado agregar el driver.
  2. No has agregado el driver al classpath.

Si no sabes agregar una librería al classpath, solo ve a propiedades del proyecto, en la opción Libraries haz click en Add Jar/Folder.

Actualización

Si usas Java 8 no podrás usar el driver JDBC-ODBC ya que ha sido removido. Usa UCanAccess para comunicarte con tu base de datos.

pWolfman_furry29 comentado Dic 3, 2015

Buenas noches, Gracias por responder @migamipe.
No tengo ninguna duda con relación al manejo y agregado de librerías a proyectos en NetBeans. He realizado proyectos que requieren conectarse a MYSQL para poder hacer las operaciones básicas (ABCQ), y para ello, es necesario realizar la importación de la librería específica para conectarse, Sin embargo, estoy conectándome a Access, y en este caso particular, no es necesario el manejo de un JAR específico, dado que la conexión se está realizando mediante ODBC, opción que viene por defecto en Windows, y que se enlaza mediante el siguiente String:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + xPath;//(C:\\BD\\Base.mdb)>>Path para la conexión con BD local.
        Connection conn = DriverManager.getConnection(url, "", "");

Como muestra el código, es necesario espeficiar el Path de la base de datos para conectarse. Probando dicho código fuente en NetBeans, puedo realizar las operaciones de Altas, bajas, cambios, etc, Pero, pierdo la conexión al compilar el proyecto obteniendo la excepcción ya citada.

MitsuGami comentado Dic 4, 2015

¿Usas Java 8? En Java 8 ha sido removido el soporte para JDBC-OBDC. Debes usar alguna librería para conectar con tu bbdd como UCanAccess

pWolfman_furry29 comentado Dic 5, 2015

Buenos días @migamipe.
He usado Java 7 para la realización de este proyecto informático, y tengo en cuenta que en su versión 8 JDBC-ODBC Se es removido completamente, por lo que ya no es posible conectarse sin el uso de alguna librería que reemplace JDBC-ODBC.

Ahora bien, investigando sobre el uso de UCANACCESS, he visto que es necesario incluir 5 librerías para realizar la conexión sin ODBC, es decir:

ucanaccess-3.0.2.jar  
lib/commons-lang-2.6.jar  
lib/commons-logging-1.1.1.jar  
lib/hsqldb.jar  
lib/jackcess-2.1.2.jar

De modo que he constatado que estas librerías aún están en desarrollo, por lo que únicamente ofrecen la posibilidad de hacer consultas SELECT sobre archivos MDB. Son una alternativa, sin embargo, aún requieren actualizaciones de estabilidad para ser implementadas de forma profesional.

El ejemplo que desarrollé con UCANACCESS es es siguiente:

package ucanconnect;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
 *
 * @author Pedro Ramos Millán-Universidad Tecnológica de Tecámac
 */
public class UCANSelect {

    public static void main(String[] args) {

            String path="C:\\SAEH\\Datos\\SAEH.accdb";
        try{
        Connection conn=DriverManager.getConnection("jdbc:ucanaccess://"+path);//Así se define el String de conexión con UCANACCESS
        /*Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + path;
        Connection conn = DriverManager.getConnection(url, "", "");*/
        System.err.println("Conexión con UCANACCESS Exitosa :D");
        Statement esta=conn.createStatement();
        ResultSet rs=esta.executeQuery("select *from medicos");
        while(rs.next()){
        String a=rs.getString(1);
        String b=rs.getString(2);
        String c=rs.getString(3);

        System.out.println(a+"::"+b+"::"+c);

        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Al intentar insertar con UCANACCESS, obtengo muchos errores, y la operación no se lleva a cabo:

WARNING:violación del restricción de integridad: no ha registro padre en clave foránea; "AFECCIONES12_{84D55855-8A79-4B9A-B25C-890B6A41C2C6}" table: AFECCIONES12
WARNING:Detected Foreign Key constraint breach, table AFECCIONES12, record Row[6759:48][{CLUES=MCSSA018774,FOLIO=1412239,EGRESO=Mon Dec 08 00:00:00 CST 2014,AFEC=T253,NUMAFEC=1}]: making the table AFECCIONES12  readonly 
WARNING:Error in the metadata of the table AFECCIONES12: table's row count in the metadata is 2918 but 2001 records have been found and loaded by UCanAccess. All will work fine, but it's better to repair your database.
WARNING:violación del restricción de integridad: no ha registro padre en clave foránea; AFECCIONES2_EGRESOAFECCIONES table: AFECCIONES2
WARNING:Detected Foreign Key constraint breach, table AFECCIONES2, record Row[52:48][{CLUES=MCSSA018774,FOLIO=1410195,EGRESO=Fri Oct 03 00:00:00 CDT 2014,AFEC=C61X,NUMAFEC=2}]: making the table AFECCIONES2  readonly 
WARNING:Error in the metadata of the table AFECCIONES2: table's row count in the metadata is 2918 but 2001 records have been found and loaded by UCanAccess. All will work fine, but it's better to repair your database.
WARNING:violación del restricción de integridad: no ha registro padre en clave foránea; AFECCIONES3_EGRESOAFECCIONES table: AFECCIONES3
WARNING:Detected Foreign Key constraint breach, table AFECCIONES3, record Row[6574:9][{CLUES=MCCRO000025,FOLIO=1165411,EGRESO=Fri Sep 11 00:00:00 CDT 2015,AFEC=E100,NUMAFEC=1}]: making the table AFECCIONES3  readonly 
WARNING:Detected Not Null constraint breach, table CATCIE10, record Row[244:8][{letra=E,CAUSA=E079,A=F,Nombre=Trastorno de la glándula tiroides, no especificado,LSex=,LInf=,LSup=,Triv=F,errad=F,N_inter=F,Nob=F,Nin=F,Ninmtobs=F,No_CBD=F,No_Aph=F,FETAL=F,capitulo=04,Lista1=054,Grupo1=051,Lista5=103,ACTUALIZAC=,year_modif=<null>,prinmorta=060,prinmorbi=060,lm_morbi=20C,lm_morta=20C,lgbd165=81.0,lOMSBeck=88.0,lgbd190=81.0}]: making the table CATCIE10  readonly 

Seguimos en la búsqueda de una alternativa.

MitsuGami comentado Dic 5, 2015

Claro que están en desarrollo. Las librerías están en desarrollo todo el tiempo, por eso liberan releases cada cierto tiempo. Si el proyecto es profesional y no de aprendizaje, entonces no entiendo sinceramente cómo se pudo elegir MS Access como base de datos.

¿Quieres un consejo sincero? Migra a una base de datos real. Te vas a ahorrar un montón de problemas y ni hablar de seguridad de la data.

PD: Lee los errores. Dice que hay problemas con restricciones not null en X tabla y en tal fila. Revisa lo que te dice el log y repara tu base de datos.

pWolfman_furry29 comentado Dic 6, 2015

Buenas noches @migamipe.
Tienes toda la razón del mundo. El proyecto informático que estoy haciendo básicamente tiene que enlazarse a una base de datos perteneciente a un subsistema ya existente, que no sé por qué diablos decidieron usar Access, del cual no puedo hacer más que insertar información en una tabla específica(Egresos). Ni hablar, son los gajes de todo buen informático proponer soluciones óptimas ante las tecnologías poco eficientes con las que se ha trabajado en el pasado.

Ahora bien, he notado que puedo insertar sin problema la información con UCANACCESS, haciéndolo de 1 registro a la vez, pero, obtengo un "General Error" tras alimentar la base de datos con un ciclo FOR.

package Prototipo;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.sql.DriverManager;
/**
 * @author Pedro Ramos Millán-Universidad Tecnológica de Tecámac
 */

public class InsertarMedicos {
   public static void main(String[]ar){ 

   try{
       //Connection conn=Controlador.Conexion.conectar("D:\\Proyecto HRAEZ\\SAEHDesarrollo\\SAEH\\Datos\\SAEH1515.mdb");              
       String path="C:\\SAEH\\Datos\\SAEH1515.mdb";
       Connection conn=DriverManager.getConnection("jdbc:ucanaccess://"+path); 
       PreparedStatement psta=null;
       FileInputStream fis=new FileInputStream("C:\\SAEH\\Datos\\ListaMedicosInsert.xlsx");
               XSSFWorkbook wb=new XSSFWorkbook(fis);
               XSSFSheet sheet=wb.getSheetAt(0);

               for(int i=0;i<sheet.getLastRowNum();i++){
               XSSFRow row=sheet.getRow(i);

       String insertar="insert into medicos(clues,cedula,nombremed)values(?,?,?)";
       psta=conn.prepareStatement(insertar);

       psta.setString(1, "MCSSA018774");
       psta.setString(2, row.getCell(123).toString());
       psta.setString(3, row.getCell(121).toString()+""+row.getCell(122));

       int xx=psta.executeUpdate();
       conn.commit();

       if(xx==1){
       System.out.println("Registro Insertado Correctamente= "+i);       
       }
       else{
       System.out.println(xx);
       }     
               }
   conn.close();

   }catch(Exception er){
   er.printStackTrace();
   }

   } 
}

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta