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

2votos

Buenas noches.
Me encuentro desarrollando un pequeño módulo en Java que tiene la función de importar la información procedente de un archivo de excel a una base de datos de Microsoft Access. Para ello, estoy usando las librerías de Apache POI para leer el archivo en Excel, y ODBC para realizar la conexión con la Base de datos.
Al ejecutar el código, sólo logro insertar la primer fila del libro en excel, para después obtener la siguiente excepcción:

java.sql.SQLException: General error
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6986)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(JdbcOdbcStatement.java:253)

El código que se encarga de esta función es el siguiente:

package Prototipo;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @author Pedro Ramos Millán-Universidad Tecnológica de Tecámac
 */
public class InsertaMdb {
   public static void main(String[]ar){ 

   try{
       Connection conn=Controlador.Conexion.conectar("D:\\Proyecto HRAEZ\\SAEH1415.mdb");       
       PreparedStatement psta=null;
       FileInputStream fis=new FileInputStream("C:\\Users\\equipo\\Desktop\\pruebaMédicos.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, row.getCell(0).toString());
       psta.setString(2, ""+row.getCell(1).toString());
       psta.setString(3, ""+row.getCell(2).toString());

       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();
   }

   } 
}

Para hacer la conexión con la Base de datos de Access, Uso un jFileChooser que se encarga de recupera la ruta de la base de datos del equipo, y que es recibida en una variable de tipo String como se ve a continuación:

package Controlador;
import java.sql.Connection;
import java.sql.DriverManager;

public class Conexion {

public  static Connection conectar(String xPath) {//xPath es la ruta de la base de datos
    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.err.println("Conexión Exitosa :D"); 
        return conn;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
}
}
}

De antemano, muchísimas gracias por su atención. Que tengan una excelente noche.

2 Respuestas

3votos

pWolfman_furry29 Puntos910

Buenas tardes a todos.
Antes de dar por cerrada esta pregunta, me gustaría menciona una situación que me llamó la atención, y que en consecuencia, causó esta SQLException.

Durante la etapa de pruebas correspondiente a este módulo, se hizo la inserción de datos usando siempre el mismo archivo de Excel(O como lo llaman en el argot hospitalario, "Layout"). Para hacer la lectura del archivo en Excel con Apache POI, en este módulo usé un ciclo FOR, que se encarga de realizar la lectura de los campos del mismo:

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, row.getCell(0).toString());
       psta.setString(2, ""+row.getCell(1).toString());
       psta.setString(3, ""+row.getCell(2).toString());

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

MS-Access por otra parte, al intentar realizar la inseción de datos, advertía que éstos ya habían sido agregados, y que podría causar valores duplicados. Aunado al tamaño del libro en Excel, se lanzaba dicha alerta N cantidad de veces, por lo que JAVA nos daba la Excepcción "java.sql.SQLException: General error", misma que fue solucionada, en primer lugar, personalizando la excepcción, de modo que a los usuarios se les alertara si ya existían los datos en la base de datos, causando con esto, el agregado de un nuevo "Layout" de Médicos más reciente.

OJO: Esta "linda" experiencia no quiere decir que en todo los casos esta excepcción se pueda lanzar por los mismo factores, hay infinidad de motivos por los cuales se puede mostrar.

Por ejemplo, cuando se omite cerrar la conexión, o bien, cuando no se manda a llamar al método "conn.comit()" en la misma.

Muchas gracias por su amable atención y tiempo :).

1voto

bl4z3r Puntos16850

En esta linea quieres hacer una inserción en la tabla Médicos

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

Pero la sentencia SQL esta mal escrita. Falta un espacio antes de VALUES. Debería estar bien formateada de la siguiente manera:

INSERT INTO medicos(clues, cedula, nombremed) VALUES (?, ?, ?)

0voto

pWolfman_furry29 comentado

Buenas tardes @bl4z3r, Gracias por responder.
He realizado el formateo de la sentencia SQL de acuerdo a tu comentario, lo mismo para los demás módulos que contiene el Sistema, aunque, sin resultado aparente.

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

Otras Preguntas y Respuestas


...

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

Conecta