PDA

Visualizza la versione completa : [java] database


rinosan_76
14-10-2002, 14:05
Ciao a tutti,
ho un piccolo problemino con JDBC: non riesco ad effettuare una query del tipo "SELECT * FROM info WHERE nickname = ?" dove al posto del "?" devo passare un parametro. Come si fa? Info è una query di unione tra due tabelle.

io ho provato in 2 modi:
il primo

try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException pe){
System.out.println(pe.toString());
System.out.println("Il driver non può essere caricato");
}
try{
Connection conn = DriverManager.getConnection("jdbc:odbc:utentiJChat","","");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT *FROM info WHERE nickname=\"+nick+"\"");
while(rs.next()){

// richiamo i dati con rs.getString("dati");

}
}
catch(SQLException _sql){
System.out.println(_sql.getMessage());
_sql.printStackTrace(System.out);
System.out.println("Problemi di lettura del DB");
}

il secondo

try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException pe){
System.out.println(pe.toString());
System.out.println("Il driver non può essere caricato");
}
try{
Connection conn = DriverManager.getConnection("jdbc:odbc:utentiJChat","","");
ResultSet rs=null;
PreparedStatement pstmt= conn.prepareStatement("SELECT * FROM info WHERE nickname = ?");
pstmt.setString(1,nick);
rs=pstmt.executeQuery();



if(rs.getString("visualInfo").equals("si") && rs.getString("autorPosta").equals("si")){
info=rs.getString("nome")+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+rs.getString("prov")+"¤"+rs.getString("citta")+"¤"+rs.getString("mail")+"¤"+rs.getString("segniPart")+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(rs.getString("visualInfo").equals("si") && !rs.getString("autorPosta").equals("si")){
info=rs.getString("nome")+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+rs.getString("prov")+"¤"+rs.getString("citta")+"¤"+"Non Autorizzato"+"¤"+rs.getString("segniPart")+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(!rs.getString("visualInfo").equals("si") && rs.getString("autorPosta").equals("si")){
info="Non Autorizzato"+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+rs.getString("mail")+"¤"+"Non Autorizzato"+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(!rs.getString("visualInfo").equals("si") && !rs.getString("autorPosta").equals("si")){
info="Non Autorizzato"+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}

}
catch(SQLException _sql){
System.out.println(_sql.getMessage());
_sql.printStackTrace(System.out);
System.out.println("Problemi di lettura del DB");
}

Cosa sbaglio?

pippo75
14-10-2002, 14:12
la seconda soluzione è quella corretta (funziona anche meglio se ad esempio hai dei nick con apostrofi)
quello che manca è l'istruzione
while(rs.next())
subito dopo l'esecuzione dello statement, altrimenti il cursore si troverà prima del primo elemento e quando tenti di leggere i dati verosimilmente ti darà errore

rinosan_76
14-10-2002, 16:30
Grazie l'ho corretta in questo modo ma non va ancora, mi da errore: Data no found!

private String leggiInfoDb(String nick){
String info="";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException pe){
System.out.println(pe.toString());
System.out.println("Il driver non può essere caricato");
}
try{
Connection conn = DriverManager.getConnection("jdbc:odbc:utentiJChat","","");
ResultSet rs=null;
PreparedStatement pstmt= conn.prepareStatement("SELECT * FROM info WHERE nickname = ?");
pstmt.setString(1,nick);
rs=pstmt.executeQuery();
while(rs.next()){
if(rs.getString("visualInfo").equals("si") && rs.getString("autorPosta").equals("si")){
info=rs.getString("nome")+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+rs.getString("prov")+"¤"+rs.getString("citta")+"¤"+rs.getString("mail")+"¤"+rs.getString("segniPart")+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(rs.getString("visualInfo").equals("si") && !rs.getString("autorPosta").equals("si")){
info=rs.getString("nome")+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+rs.getString("prov")+"¤"+rs.getString("citta")+"¤"+"Non Autorizzato"+"¤"+rs.getString("segniPart")+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(!rs.getString("visualInfo").equals("si") && rs.getString("autorPosta").equals("si")){
info="Non Autorizzato"+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+rs.getString("mail")+"¤"+"Non Autorizzato"+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(!rs.getString("visualInfo").equals("si") && !rs.getString("autorPosta").equals("si")){
info="Non Autorizzato"+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}
}
}
catch(SQLException _sql){
System.out.println(_sql.getMessage());
_sql.printStackTrace(System.out);
System.out.println("Problemi di lettura del DB");
}

return info;
}
-----------------------------------------------------------------

i campi "visualInfo" e "autorPosta" sono campi boolean che Access descrive come Si/No. E' giusto fare i controlli come ho fatto io?

pippo75
15-10-2002, 09:17
Siccome sono dei campi boolean, puoi utilizzare il metodo getBoolean, in modo che si prende il dato nativo
Non ha senso fare il controllo sulla stringa sì/no, perchè quella è la rappresentazione a video del dato (Access potrebbe anche memorizzarlo come intero)

A parte questo dettaglio, il tutto mi sembra corretto, magari potresti mettere in rilievo la riga alla quale ti dà errore,
e assicurarti che ci siano dati validi

rinosan_76
15-10-2002, 11:23
Grazie non ci avevo pensato al getBoolean!!!
Ci Provo subito.

rinosan_76
15-10-2002, 11:43
Ho modificato i getString in getBoolean all'interno de controlli ma mi da questi errori in esecuzione:

No data found
java.sql.SQLException: No data found
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java :6287)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(JdbcOdbc. java:3211)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Jdb cOdbcResultSet.jav
:5434)
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcRes ultSet.java:571)
at sun.jdbc.odbc.JdbcOdbcResultSet.getBoolean(JdbcOdb cResultSet.java:43
)
at sun.jdbc.odbc.JdbcOdbcResultSet.getBoolean(JdbcOdb cResultSet.java:44
)
at NetServer.leggiInfoDb(JChatServer.java:155)
at NetServer.access$300(JChatServer.java:6)
at NetServer$ConnessioneClient.run(JChatServer.java:2 99)
at java.lang.Thread.run(Thread.java:536)
Problemi di lettura del DB
java.lang.ArrayIndexOutOfBoundsException
at NetServer$ConnessioneClient.run(JChatServer.java:3 01)
at java.lang.Thread.run(Thread.java:536)

----------------------------------------------------------------------

Sai che vuol dire?

pippo75
15-10-2002, 11:51
sei sicuro che ci siano i dati all'interno dei campi?
e poi potresti visualizzare la riga dell'errore? la VM ha detto che l'errore si trova alla riga 155, ma io non so qual è
se magari la metti si riesce a capire di + ...

rinosan_76
15-10-2002, 12:06
scusa non avevo capito cosa intendevi...

La riga 155 è il primo else if

---------------------------------------------------------------------
private String leggiInfoDb(String nick){
String info="";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException pe){
System.out.println(pe.toString());
System.out.println("Il driver non può essere caricato");
}
try{
Connection conn = DriverManager.getConnection("jdbc:odbc:utentiJChat","","");
ResultSet rs=null;
PreparedStatement pstmt= conn.prepareStatement("SELECT * FROM info WHERE nickname = ?");
pstmt.setString(1,nick);
rs=pstmt.executeQuery();
while(rs.next()){
if(rs.getBoolean("visualInfo") && rs.getBoolean("autorPosta")){
info=rs.getString("nome")+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+rs.getString("prov")+"¤"+rs.getString("citta")+"¤"+rs.getString("mail")+"¤"+rs.getString("segniPart")+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
(155) }else if(rs.getBoolean("visualInfo") && !rs.getBoolean("autorPosta")){
info=rs.getString("nome")+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+rs.getString("prov")+"¤"+rs.getString("citta")+"¤"+"Non Autorizzato"+"¤"+rs.getString("segniPart")+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(!rs.getBoolean("visualInfo") && rs.getBoolean("autorPosta")){
info="Non Autorizzato"+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+rs.getString("mail")+"¤"+"Non Autorizzato"+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}else if(!rs.getBoolean("visualInfo") && !rs.getBoolean("autorPosta")){
info="Non Autorizzato"+"¤"+rs.getString("dataNascita")+"¤"+rs.getString("stato")+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+"Non Autorizzato"+"¤"+rs.getString("hobby")+"¤"+rs.getString("autorPosta")+"¤"+rs.getString("visualInfo")+"§"+rs.getString("avatar");
}
}
}
catch(SQLException _sql){
System.out.println(_sql.getMessage());
_sql.printStackTrace(System.out);
System.out.println("Problemi di lettura del DB");
}

return info;
}

---------------------------------------------------------------------

pippo75
15-10-2002, 14:44
non so, a prima vista sembrerebbe tutto a posto :bhò:

rinosan_76
15-10-2002, 15:48
Grazie lo stesso, ma ho risolto il problema facendo i controlli al di fuori di questa funzione perchè mi sono accorto che se li eliminavo e richiedevo solo i dati tutto funzionava.

Loading