SQL Exception (NetBeans + Derby DB)

0 respostas
L

Dae pessoal!

Bom… andei estudando bastante a parte de JDBC do Java. Depois de apanhar um pouquinho, tava trabalhando legal com a ponte JDBC:ODBC, entre java e access. Fiz uma aplicação, e como deu certo fiquei bastante animado.

Então resolvi ir pra um DB mais interessante que Access. No site do NetBeans (www.netbeans.org) tem uns tutos legais de interface gráfica e associação com BD Derby. Fiz o tuto da parte de GUI, bem fácil, baixei o Derby, instalei, configurei, gerei meu DB com uma tabela Contatos de teste, tudo certinho.

Desenvolvi a aplicação deste tutorial:

http://www.netbeans.org/kb/50/gui-database.html

A Aplicação compila perfeitamente; Ta tudo certinho. No entanto não consigo me livrar dessa maldita Exception, e acaba que a aplicação não funciona!

java.sql.SQLException: Invalid state
        at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
        at com.sun.rowset.JdbcRowSetImpl.beforeFirst(JdbcRowSetImpl.java:1879)
        at Meu.ContatoAoEditor.RowSetTableModel.updateRowCount(RowSetTableModel.java:168)
        at Meu.ContatoAoEditor.RowSetTableModel.setRowSet(RowSetTableModel.java:138)
        at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:78)
        at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
        at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
java.sql.SQLException: Invalid state
        at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
        at com.sun.rowset.JdbcRowSetImpl.getMetaData(JdbcRowSetImpl.java:1617)
        at Meu.ContatoAoEditor.RowSetTableModel.findColumnIndex(RowSetTableModel.java:102)
        at Meu.ContatoAoEditor.RowSetTableModel.getColumnName(RowSetTableModel.java:59)
        at javax.swing.JTable.addColumn(JTable.java:1984)
        at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1000)
        at javax.swing.JTable.tableChanged(JTable.java:3009)
        at javax.swing.JTable.setModel(JTable.java:2878)
        at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:303)
        at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
        at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
java.sql.SQLException: Invalid state
        at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
        at com.sun.rowset.JdbcRowSetImpl.getMetaData(JdbcRowSetImpl.java:1617)
        at Meu.ContatoAoEditor.RowSetTableModel.findColumnIndex(RowSetTableModel.java:102)
        at Meu.ContatoAoEditor.RowSetTableModel.getColumnName(RowSetTableModel.java:59)
        at javax.swing.JTable.addColumn(JTable.java:1984)
        at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1000)
        at javax.swing.JTable.tableChanged(JTable.java:3009)
        at javax.swing.JTable.setModel(JTable.java:2878)
        at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:303)
        at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
        at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
java.sql.SQLException: Invalid state
        at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
        at com.sun.rowset.JdbcRowSetImpl.getMetaData(JdbcRowSetImpl.java:1617)
        at Meu.ContatoAoEditor.RowSetTableModel.findColumnIndex(RowSetTableModel.java:102)
        at Meu.ContatoAoEditor.RowSetTableModel.getColumnName(RowSetTableModel.java:59)
        at javax.swing.JTable.addColumn(JTable.java:1984)
        at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1000)
        at javax.swing.JTable.tableChanged(JTable.java:3009)
        at javax.swing.JTable.setModel(JTable.java:2878)
        at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:303)
        at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
        at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Realmente não sei o que fazer, principalmente porque sou iniciante. Quanto trabalhei JDBC:ODBC, a parte Model-Controller da aplicação eu que tinha feito, na mão… então tava bem mais facil. Mas nesse caso… a parte da inserção no banco ja veio pronta =\ A ideia do tuto era mostrar como integrar a GUI com o Banco. E acabou que eu não consegui entender o que está causando essa exceção. Ai vai o fonte do arquivo que tá gerando a Exception:

package Meu.ContatoAoEditor;

import java.sql.*;
import java.util.*;
import javax.sql.*;
import javax.swing.table.AbstractTableModel;

/**
 * TableModel adapter for a RowSet.
 *
 * @author Jan Stola
 */
public class RowSetTableModel extends AbstractTableModel implements RowSetListener {
    // RowSet with the data
    private RowSet rowSet;
    // Number of rows
    private int rowCount;
    // Columns visible in the table model
    private String[] visibleColumns;

    /**
     * Returns number of rows in the table.
     *
     * @return number of rows in the table.
     */
    public int getRowCount() {
        return rowCount;
    }

    /**
     * Returns number of columns in the table.
     *
     * @return number of columns in the table.
     */
    public int getColumnCount() {
        int columnCount = 0;
        try {
            if (visibleColumns != null) {
                columnCount = visibleColumns.length;
            } else if (rowSet != null) {
                columnCount = rowSet.getMetaData().getColumnCount();
            }
        } catch (SQLException sqlex) {
            sqlex.printStackTrace();
        }
        return columnCount;
    }

    /**
     * Returns label of the specified column (can be set for example
     * via <code>select column as columnLabel ...</code>).
     *
     * @return name of the specified column.
     */
    public String getColumnName(int column) {
        String name = super.getColumnName(column);
        if (visibleColumns != null) {
            name = visibleColumns[column].toUpperCase();
            column = findColumnIndex(visibleColumns[column]);
        }
        if (column != -1) {
            try {
                name = rowSet.getMetaData().getColumnLabel(column+1);
            } catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
        }
        return name;
    }

    /**
     * Returns value at the specified row and column.
     *
     * @return value at the specified row and column.
     */
    public Object getValueAt(int rowIndex, int columnIndex) {
        Object value = null;
        try {
            rowSet.absolute(rowIndex+1);
            if (visibleColumns != null) {
                columnIndex = findColumnIndex(visibleColumns[columnIndex]);
            }
            if (columnIndex != -1) {
                value = rowSet.getObject(columnIndex+1);
            }
        } catch (SQLException sqlex) {
            sqlex.printStackTrace();
        }
        return value;
    }

    // Helper method used when <code>visibleColumns</code> property is set.
    // Transforms columnName into index of the column in the model.
    private Map columnToIndexMap = new HashMap();
    private int findColumnIndex(String columnName) {
        columnName = columnName.toUpperCase();
        Integer index = (Integer)columnToIndexMap.get(columnName);
        if (index != null) return index.intValue();
        int columnIndex = -1;
        if (rowSet != null) {
            try {
                ResultSetMetaData metaData = rowSet.getMetaData();
                int columns = metaData.getColumnCount();
                for (int i=1; i<=columns; i++) {
                    if (metaData.getColumnName(i).toUpperCase().equals(columnName)) {
                        columnIndex = i-1;
                        break;
                    }
                }
            } catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
        }
        return columnIndex;
    }

    /**
     * Getter for the <code>rowSet</code> property.
     *
     * @return row set used by this model.
     */
    public RowSet getRowSet() {
        return rowSet;
    }

    /**
     * Setter for the <code>rowSet</code> property.
     *
     * @param rowSet row set with the data.
     */ 
    public void setRowSet(RowSet rowSet) {
        if (this.rowSet != null) {
            this.rowSet.removeRowSetListener(this);
        }
        this.rowSet = rowSet;
        columnToIndexMap.clear();
        rowSet.addRowSetListener(this);
        updateRowCount();
        fireTableStructureChanged();
    }

    /**
     * Getter for the <code>visibleColumns</code> property.
     *
     * @return columns visible in the table model or <code>null</code>
     * if all columns of the row set should be visible.
     */
    public String[] getVisibleColumns() {
        return visibleColumns;
    }

    /**
     * Setter for the <code>visibleColumns</code> property.
     *
     * @param columns visible in the table model or <code>null</code>
     * if all columns of the row set should be visible.
     */
    public void setVisibleColumns(String[] visibleColumns) {
        this.visibleColumns = visibleColumns;
        columnToIndexMap.clear();
        fireTableStructureChanged();
    }

    // Helper method that updates <code>rowCount</code> field.
    private void updateRowCount() {
        int rowCount = 0;
        try {
            rowSet.beforeFirst();
            while (rowSet.next()) rowCount++;
        } catch (SQLException sqlex) {
            sqlex.printStackTrace();
        }
        this.rowCount = rowCount;
    }

    // Implementation of RowSetListener
    public void rowSetChanged(RowSetEvent event) {
        updateRowCount();
        fireTableStructureChanged();
    }

    public void rowChanged(RowSetEvent event) {
        updateRowCount();
        fireTableDataChanged();
    }

    public void cursorMoved(RowSetEvent event) {}

}

Como eu disse, é o código do tutorial.

Qualquer dica é bem vinda.

Muito obrigado a todos!

Douglas Vargas

Criado 1 de dezembro de 2006
Respostas 0
Participantes 1