PDA

Visualizza la versione completa : [JAVA] JTable e database


Devil01
27-11-2005, 14:57
Salve ragazzi..
Sto cercando di estrarre dei dati da un database e di inserirli in una jtable ma mi lancia un' eccezione ora vi posto il codice e l'errore.

.................................................. .................
int righe=0;
Object[][] value=new Object[righe][2];
String[] columnNames={"nome","cognome"};
.................................................. .................

public void connetti(){

int id=0;
int i=0;
try {
Statement st = connection.createStatement();
String query = "SELECT * FROM archivio";
ResultSet rs = st.executeQuery(query);
while(rs.next()){
value[i][0]=rs.getString("nome");
value[i][1]=rs.getString("cognome");

i++;
}

}catch(SQLException je){}
}
.................................................. .................

JTable tabella = new JTable(value,columnNames);

Ora quando vado a compilare la classe non mi da nessn errore ma quando lancio il metodo mi tira fuori un ArrayIndexOutOfBoundsException : 0
proprio sulla linea "value[i][0]=rs.getString("nome");" mi date un aiutino grazie :ciauz:

Andrea1979
27-11-2005, 15:21
Stai dichiarando value come Object[0][2]...

Devil01
27-11-2005, 17:19
Ciao e grazie di avermi risposto ora ti posto la classe
puoi spiegarti meglio dove sbaglio grazie



public class Frame extends JFrame {
static ResultSet rs2;
int righe=0;
int c=0;
Object[][] value=new Object[righe][2];
String[] columnNames={"nome","cognome"};

public Frame() {




getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
jScrollPane1.getViewport().add(jTable1);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Rirsultati Tabella");
pack();
setVisible(true);
connetti();
ritorna();
}

public static void main(String[] args) {
Frame frame = new Frame();
}

JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable(value,columnNames);

public void connetti(){
Connection connection = null;
String codice="";
int id=0;
int i=0;
try {
String databaseURI = "jdbc:mysql://localhost:3306/archivio";
String userName = "root";
String password = "";
Driver driver = new org.gjt.mm.mysql.Driver();
DriverManager.registerDriver(driver);
connection = DriverManager.getConnection(databaseURI, userName,
password);
if (!connection.isClosed())
System.out.println("Connesso!");
} catch(Exception e) {
System.err.println("Exception: " + e.getMessage());
}
try {
Statement st = connection.createStatement();
String query = "SELECT * FROM tabella";
ResultSet rs = st.executeQuery(query);
while(rs.next()){
value[i][0]=rs.getString("nome");
value[i][1]=rs.getString("cognome");
i++;
}



}catch(SQLException je){}

}


public void ritorna(){
Connection connection = null;
try {
Statement st = connection.createStatement();
String query = "SELECT * FROM tabella";
ResultSet rs = st.executeQuery(query);

rs2=st.executeQuery("SELECT COUNT (*) as c FROM tabella");
rs2.next();
righe=rs2.getInt("c");


}catch(SQLException ve){}


}

}

Andrea1979
27-11-2005, 17:32
Quando tu inizializzi il vettore value



int righe=0;
Object[][] value=new Object[righe][2];


Ossia value = Object[0][2]

Poi quando vai a metterci dentro i risultati della query, java suppone che value sia almeno [1][2] ed è per questo che ti si solleva l'eccezione ArrayOutOfBound. Perché inizializzi value in quel modo?

Ti conviene inzializzare value alla lunghezza del recordset restituito dalla query (cerca sul forum, se n'è parlato almeno un paio di volte nella scorsa settimana), e solo allora caricarlo con i dati estratti dal database.

Ossia, sposta l'inizializzazione dopo


try {
Statement st = connection.createStatement();
String query = "SELECT * FROM tabella";
ResultSet rs = st.executeQuery(query);
//fai qualcosa per determinare il numero di righe estratte:
// quindi inizializza con
value = Object[righe_estratte][2]



e poi prosegui normalmente con il ciclo while

Devil01
27-11-2005, 19:57
Andrea credo di aver fatto cosa mi avevi suggerito


int righe;
int c;
Object[][] value;
.........
try {
Statement st = connection.createStatement();
String query = "SELECT * FROM tabella";
ResultSet rs = st.executeQuery(query);
value = new Object[righe][2];
while(rs.next()){
value[i][0]=rs.getString("nome");
value[i][1]=rs.getString("cognome");
i++;
}
}catch(SQLException je){}

try {
Statement st = connection.createStatement();
rs2=st.executeQuery("SELECT COUNT (*) as c FROM tabella");
rs2.next();
righe=rs2.getInt("c");

}catch(SQLException ve){}
Ma mi restituisce un errore quando lancio la classe

java.lang.NullPointerException
.....

:dhò:

Andrea1979
27-11-2005, 20:12
Si, ma ti stai perdendo in un bicchier d'acqua:

potresti provare con



try {
Statement st = connection.createStatement();
String query = "SELECT * FROM tabella";
ResultSet rs = st.executeQuery(query);
righe = rs.last().getRow();
rs.beforeFirst();
value = new Object[righe][2];
while(rs.next()){
value[i][0]=rs.getString("nome");
value[i][1]=rs.getString("cognome");
i++;
}
}catch(SQLException je){}


Occhio che però certi recordset con certi database sono scorsi solo una volta, in avanti, per cui potresti ottenere un'eccezione in fase di esecuzione.

Alternativamente, potresti creare un Vector ed aggiungere al Vector una riga del recordset alla volta. Alla fine per sapere quante righe hai estratto usi il metodo size() di Vector.

Loading