25. februar 2003 - 12:22Der er
23 kommentarer og 1 løsning
Underlig fejlmeddelse
Jeg er ved at lave en database til et java mail program, i denne er der 2 tabeller: brugerTabel BrugerNavn, PassWord, id PostTabel post, id hvor id er linket imellem de 2 tabeller Min kode ser ud som følgende:
import java.sql.*; import java.util.*;
public class AdminDB { static Connection connect;
private static void loadDriver() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ex) { System.out.println("Fejl, kan ikke load'e driveren"); } }
private static void openDB() { try { connect = DriverManager.getConnection("jdbc:odbc:postkasse"); } catch (SQLException se) { System.out.println("Fejl, kan ikke etablere forbindelse til databasen"); } }
private static void closeDB() { try { connect.close(); } catch (SQLException se) { System.out.println("Fejl, kan ikke ikke lukkes"); } }
private static void indsaetmail(String afsender, String Password) { try { Statement stm = connect.createStatement(); stm.executeUpdate("INSERT INTO BrugerTabel (BrugerNavn, PassWord) VALUES ('"+ afsender +"', '" + Password + "')"); } catch (SQLException se) { System.out.println("Fejl, række kan ikke indsætte Brugernavn i tabellen BrugerTabel"); } } private static void hentmail(String brugernavn) { try { Statement stm = connect.createStatement(); ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel WHERE BrugerNavn = 'anja' "); System.out.println(brugerId); } catch (SQLException ex) { System.out.println("Kan ikke finde bruger"); } } public static void main(String []args) { loadDriver(); openDB(); indsaetmail("Indsættelse i DB", "Password til DB"); hentmail("anja"); closeDB(); }
}
Jeg kan godt skrive til databasen, men når jeg leder efter et id som referer til et navn får jeg denne fejl meddelse: sun.jdbc.odbc.JdbcOdbcResultSet@c21495 og den bliver ikke fanget med catch
Du kan ikke bare skrive den ud med System.out.println(brugerId); Du skal løbe dit result igennem med en løkke. Det er ikke en fejl du får, det er blot det pågældende objekst egen toString() du ser.
Her sker det: try{ Statement stm = connect.createStatement(); ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel WHERE BrugerNavn = 'anja' "); System.out.println(brugerId); //<----- }
Det er ikke en SQL fejl, at der evt ikke er en bruger, der hedder 'porky'. I det tilfælde løber du blot ikke din while løkke igennem. Det er til gengæld en SQL fejl hvis der er syntaksfejl i SQL-sætningen, eller du refererer felter, der ikke findes.
Når jeg skriver min exception ud med dit forslag får jeg følgende: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1. at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6106) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:6263) at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:2525) at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:337) at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:252) at AdminDB.hentmail(AdminDB.java:80) at AdminDB.main(AdminDB.java:97) Finished executing
Jeg er med på at det ikke er en SQL fejl hvis der ingen bruger er, men i dette tilfælde er der en bruger der hedder porky )
Grunden til at jeg vil have det skrevet ud er at så er jeg sikker på at jeg finder det rigtige i DB'en, det vil jeg selvfølgelig ikke senere i projektet.
Skal der stå 'porky'... Hmmm... Prøv med try { Statement stm = connect.createStatement(); String bruger = "porky"; ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel WHERE BrugerNavn = ='"+bruger+"'" ); while(brugerId.next()) { System.out.println("---> "+brugerId.getString("BrugerNavn") ); }
hee hee jeg tror bare ikke det skal virke )) Jeg får stadigvæk meddelsen fra før ( Tak for de hurtige svar er lækkert at arbejde med Har været inde og se på det link d posted, der skriver de det på samme måde som her, meget underligt syntes jeg.
Har du prøvet med: "Select * from Brugertabel" Og så før din while kan du prøve System.out.println("Size "+brugerId.size() ); Jeg tror nok den hedder size() ellers kan du lige se i API'en fra SUN.
Når jeg bruger Select * FROM BrugerTabel får jeg ingen fejlmeddelse, og jeg kan skrive min poster ud en kolonne af gangen, ved at bruge følgende: System.out.println("---> "+brugerId.getString("BrugerNavn") ); og så ændre BrugerNavn til henholdsvis PassWord og id som de hedder i DB' en Hvis jeg laver følgende: ResultSet brugerId = stm.executeQuery("Select * FROM BrugerTabel WHERE BrugerNavn = '*' "); får jeg bare en meddelse om Finished executing
Det virker bare fint nu, nu kan jeg hente de data jeg har brug for, tak for hjælpen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.