Problem accessing the Access Database with UcanAccess in Java

1

I am with a simple project, learning to create, modify and access databases from Netbeans with Java . They force me to use a Microsoft Access database, and I know there are problems accessing them from Netbeans version 8 . I am using the libraries of UcanAccess 4.0.0 . The problem comes when I wanted to create a table and I did not create it. I thought that it established the connection to the database well, but it turns out that I missed an exception that tells me that the connection is closed. I found the fault and it was that it closed the connection before executing the code. However, when I thought that everything was fine, I missed another mistake.

This is the error:

  

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 4.0.0 unexpected word: (

I leave the code for you to see:

package accesobd;
import java.sql.*;

public class ConnectBD
{
    private Connection conexion;
    private Statement sentencia;
    private final String controlador;
    private final String nombre_BD;

    public ConnectBD()
    {
        this.controlador="net.ucanaccess.jdbc.UcanaccessDriver";
        this.nombre_BD="tiendaropa.mdb";
    }
    public boolean establecerConexion()
    {
        try{
            Class.forName(controlador);
            conexion=DriverManager.getConnection("jdbc:ucanaccess://"+this.nombre_BD);
        }catch (Exception ex){
            return false;
        }
        try{
            this.sentencia=this.conexion.createStatement();
        }catch(SQLException ex){
            return false;
        }
        return true;
    }
    public ResultSet ejecutarConsulta (String sentencia) throws SQLException{
        ResultSet rs;
        rs=this.sentencia.executeQuery(sentencia);
        return rs;
    }

    public void ejecutarCrearTabla (String sentencia) throws SQLException{
        this.sentencia.executeUpdate(sentencia);
    }
    public boolean establecerCierre()
    {
        try{
            conexion.close();
        }catch (Exception ex){
            return false;
        }
        return true;
    }
}

Another class:

package accesobd;
import java.sql.*;

public class ControllerBD
{
    private final ConnectBD con;

    public ControllerBD(){
        this.con=new ConnectBD();
    }
    public void crearConexion(){
        //BORRAR EL CÓDIGO DE PRUEBA
        if (con.establecerConexion()==true){
            System.out.println("satisfactorio");
        }else{
            System.out.println("insatisfactorio");
        }
    }
    public void cerrarConexion(){
        con.establecerCierre();
    }
    public ResultSet mandarConsultaSQL(String consulta) throws SQLException{
        ResultSet aux=this.con.ejecutarConsulta(consulta);
        return aux;
    }
    public void mandarCrearTabla (String consulta) throws SQLException{
        con.ejecutarCrearTabla(consulta);
    }
}

And finally the View where the bulk of the code goes.

public AccesoBDView(SingleFrameApplication app)
{
    super(app);

    /** Antes de nada, vamos a inicializar el objeto con el constructor
        y a establecer la conexión con la base de datos.
    */
    controller=new ControllerBD();
    controller.crearConexion();

    initComponents();

    // status bar initialization - message timeout, idle icon and busy animation, etc
    ResourceMap resourceMap = getResourceMap();
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
    messageTimer = new Timer(messageTimeout, new ActionListener()
    {
        public void actionPerformed(ActionEvent e) {
            statusMessageLabel.setText("");
        }
    });
    messageTimer.setRepeats(false);
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
    for (int i = 0; i < busyIcons.length; i++)
    {
        busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
    }
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener()
    {
        public void actionPerformed(ActionEvent e) {
            busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
            statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
        }
    });
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
    statusAnimationLabel.setIcon(idleIcon);
    progressBar.setVisible(false);

    // connecting action tasks to status bar via TaskMonitor
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener()
    {
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if ("started".equals(propertyName))
            {
                if (!busyIconTimer.isRunning()) {
                    statusAnimationLabel.setIcon(busyIcons[0]);
                    busyIconIndex = 0;
                    busyIconTimer.start();
                }
                progressBar.setVisible(true);
                progressBar.setIndeterminate(true);
            } else if ("done".equals(propertyName)) {
                busyIconTimer.stop();
                statusAnimationLabel.setIcon(idleIcon);
                progressBar.setVisible(false);
                progressBar.setValue(0);
            } else if ("message".equals(propertyName)) {
                String text = (String)(evt.getNewValue());
                statusMessageLabel.setText((text == null) ? "" : text);
                messageTimer.restart();
            } else if ("progress".equals(propertyName)) {
                int value = (Integer)(evt.getNewValue());
                progressBar.setVisible(true);
                progressBar.setIndeterminate(false);
                progressBar.setValue(value);
            }
        }
    });
    //cerrar la conexion creada
    controller.cerrarConexion(); 
}
@Action
public void showAboutBox() {
    if (aboutBox == null) {
        JFrame mainFrame = AccesoBDApp.getApplication().getMainFrame();
        aboutBox = new AccesoBDAboutBox(mainFrame);
        aboutBox.setLocationRelativeTo(mainFrame);
    }
    AccesoBDApp.getApplication().show(aboutBox);
}
/** This method is called from within the constructor to
    initialize the form.
    WARNING: Do NOT modify this code. The content of this method is
    always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents()
{
    mainPanel = new javax.swing.JPanel();
    botonCrearTablas = new javax.swing.JButton();
    jLabel1 = new javax.swing.JLabel();
    menuBar = new javax.swing.JMenuBar();
    javax.swing.JMenu fileMenu = new javax.swing.JMenu();
    javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
    javax.swing.JMenu helpMenu = new javax.swing.JMenu();
    javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
    statusPanel = new javax.swing.JPanel();
    javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
    statusMessageLabel = new javax.swing.JLabel();
    statusAnimationLabel = new javax.swing.JLabel();
    progressBar = new javax.swing.JProgressBar();

    mainPanel.setName("mainPanel"); // NOI18N

    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(
        accesobd.AccesoBDApp.class
    ).getContext().getResourceMap(AccesoBDView.class);
    botonCrearTablas.setText(resourceMap.getString("botonCrearTablas.text")); // NOI18N
    botonCrearTablas.setName("botonCrearTablas"); // NOI18N
    botonCrearTablas.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            botonCrearTablasMouseClicked(evt);
        }
    });
    jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
    jLabel1.setName("jLabel1"); // NOI18N

    javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
    mainPanel.setLayout(mainPanelLayout);
    mainPanelLayout.setHorizontalGroup(
        mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(mainPanelLayout.createSequentialGroup()
        .addContainerGap()
        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jLabel1)
        .addComponent(botonCrearTablas))
        .addContainerGap(297, Short.MAX_VALUE))
    );
    mainPanelLayout.setVerticalGroup(
        mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(mainPanelLayout.createSequentialGroup()
        .addGap(20, 20, 20)
        .addComponent(jLabel1)
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
        .addComponent(botonCrearTablas)
        .addContainerGap(191, Short.MAX_VALUE))
    );

    menuBar.setName("menuBar"); // NOI18N

    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
    fileMenu.setName("fileMenu"); // NOI18N

    javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(
        accesobd.AccesoBDApp.class
    ).getContext().getActionMap(AccesoBDView.class, this);
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
    exitMenuItem.setName("exitMenuItem"); // NOI18N
    fileMenu.add(exitMenuItem);

    menuBar.add(fileMenu);

    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
    helpMenu.setName("helpMenu"); // NOI18N

    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N
    helpMenu.add(aboutMenuItem);

    menuBar.add(helpMenu);

    statusPanel.setName("statusPanel"); // NOI18N

    statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

    statusMessageLabel.setName("statusMessageLabel"); // NOI18N

    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

    progressBar.setName("progressBar"); // NOI18N

    javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
    statusPanel.setLayout(statusPanelLayout);
    statusPanelLayout.setHorizontalGroup(
    statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
    .addGroup(statusPanelLayout.createSequentialGroup()
    .addContainerGap()
    .addComponent(statusMessageLabel)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 226, Short.MAX_VALUE)
    .addComponent(
        progressBar,
        javax.swing.GroupLayout.PREFERRED_SIZE,
        javax.swing.GroupLayout.DEFAULT_SIZE,
        javax.swing.GroupLayout.PREFERRED_SIZE
    )
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(statusAnimationLabel)
    .addContainerGap())
    );
    statusPanelLayout.setVerticalGroup(
        statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(statusPanelLayout.createSequentialGroup()
        .addComponent(
            statusPanelSeparator,
            javax.swing.GroupLayout.PREFERRED_SIZE,
            2,
            javax.swing.GroupLayout.PREFERRED_SIZE
        )
        .addPreferredGap(
            javax.swing.LayoutStyle.ComponentPlacement.RELATED,
            javax.swing.GroupLayout.DEFAULT_SIZE,
            Short.MAX_VALUE
        )
        .addGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
            .addComponent(statusMessageLabel)
            .addComponent(statusAnimationLabel)
            .addComponent(
                progressBar,
                javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE,
                javax.swing.GroupLayout.PREFERRED_SIZE
            )
        )
        .addGap(3, 3, 3))
    );
    setComponent(mainPanel);
    setMenuBar(menuBar);
    setStatusBar(statusPanel);
}// </editor-fold>                        

private void botonCrearTablasMouseClicked(java.awt.event.MouseEvent evt)
{
    int seleccion = JOptionPane.showOptionDialog(
        botonCrearTablas,
        "Seleccione opcion", 
        "Crear las tablas de la Base de Datos",
        JOptionPane.YES_NO_CANCEL_OPTION,
        JOptionPane.QUESTION_MESSAGE,
        null,    // null para icono por defecto.
        new Object[] { "Crear tabla Empleados", "Crear Tabla Ventas"},   
        null
    );
    if (seleccion==0)
    {
        try {
            controller.mandarCrearTabla(
            "CREATE TABLE EMPLEADOS ("
            + "CODIGO_EMPLEADO INT PRIMARY KEY NOT NULL, "+
            "NOMBRE_EMPLEADO VARCHAR (50) NOT NULL, "+
            "TELEFONO_EMPLEADO INT)");
        } catch (SQLException ex) {
            System.err.println(ex);
        }
    }else {
        try {
            controller.mandarCrearTabla(
                "CREATE TABLE VENTAS ("
                + "CODIGO_PRODUCTO INT PRIMARY KEY NOT NULL, "+
                "CODIGO_EMPLEADO INT FOREING KEY NOT NULL, "+
                "UNIDADES_VENDIDAS INT)"
            );
        } catch (SQLException ex) {
            System.err.println(ex);
        }
    }
    if (seleccion != -1)
        System.out.println("seleccionada opcion " + (seleccion + 1));
}
// Variables declaration - do not modify                     
private javax.swing.JButton botonCrearTablas;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;
private javax.swing.JPanel statusPanel;
// End of variables declaration                   

private final Timer messageTimer;
private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;

private JDialog aboutBox;
    
asked by Alberto Sáez Vela 26.01.2017 в 23:27
source

1 answer

2

I had the same problem. I will explain it in more detail for those who have the problem can solve it faster:

  • We opened the database in Access.

  • We're going Archive > Access Options
    and in " Criterion for sorting a new database "
    select the option " General-Inherited " - " Accept ".

  • We're targeting Archive > Information
    and click on " Compact and repair "

  • This should work with us and we should get the error.

        
    answered by 16.06.2017 в 09:19