BlårandMedlem sedan jan. 20032 356 inlägg Nedanstående kod resulterar i utrskriften "Ingen träff", trots att det bevisligen blir en träff...
rs = statement.executeQuery("SELECT * FROM losenord WHERE namn='emil' AND losenord='aaa'");
if(rs.getRow()==0){
out.println("Ingen träff");
}else{
while(rs.next()){
out.println(rs.getString("namn") + "-" + rs.getString("losenord") + "-" + rs.getRow() + "<br>");
}
}
...detta då nedanstende fristående kod...
while(rs.next()){
out.println(rs.getString("namn") + "-" + rs.getString("losenord") + "-" + rs.getRow() + "<br>");
}
...resulterar i texten "emil-aaa-1".
Vad beror detta problem på att den översta koden skriver ut texten "Ingen träff", trots att det är en träff och att rs.getRow() bevisligen har värdet ett, vilket kod nummer två visar? Kan ju inte direkt se att något är fel i if-satsen? Eller har jag stirrat mig blind på något simpelt fel?
BlårandMedlem sedan jan. 20032 356 inlägg Löst på egen hand :)
Var jag som hade fattat lite fel. Löste dte med nedanstående kod:
rs = statement.executeQuery("SELECT * FROM losenord WHERE namn='emil' AND losenord='aaa'");
rs.last();
if(rs.getRow()==0){
out.println("Ingen träff");
}else{
out.println(rs.getString("namn") + "-" + rs.getString("losenord") + "-" + rs.getRow() + "<br>");
}
LimeMedlem sedan sep. 2001961 inlägg Rekommendation
Hej,
Det "rekommenderade" sättet att göra detta på är att inte kolla på radnummret utan använda sig av den boolean som kommer av rs.first(), rs.next() eller rs.last().
Om du t.ex. ställer frågan SELECT DISTINCT * FROM losenord WHERE namn='emil' AND losenord='aaa'" så bör du få ut ett och endast ett resultat om det finns någon som har namnet emil och lösenordet aaa.
Då kan du göra följande:
if(rs.next()){
out.println(rs.getString("namn") + "-" + rs.getString("losenord") + "-" + rs.getRow() + "<br>");
}else{
out.println("Ingen träff");
}
Sedan skulle jag göra databasfrågan på följande sätt.
PreparedStatement pstmt = con.prepareStatement("SELECT DISTINCT * FROM losenord WHERE namn=? AND losenord=?");
pstmt.setString(1, "emil");
pstmt.setString(2, "aaa");
rs = pstm.execute();
Detta gör att applikationen blir mer oberoende av den databas du använder dig av eftersom det i specifikationen av JDBC-drivern står hur man skall stödja prepared statement. Man lämnar alltså över till drivrutinen att hålla reda på hur framför allt strängar hanteras.
En annan bra sak är att de flesta webservrar och applikationsservrar idag implementerar sina databaspooler på ett sådant sätt att de även poolar prepared statements och detta gör det hela väldigt mycket mer effektivt.
BlårandMedlem sedan jan. 20032 356 inlägg Tack för tipset och hjäpen.
Den där senaste konstruktionen du visade såg mer strukturerad och genomtänkt ut, än den jag försökte mig på, så den ska jag försöka lägga på minnet. :)