Du hast ein ResultSet, z. B. rs, dannaber wenn ich im column 1 10 rows hab wie kriege ich column 1 row 2 zmb.?
List<Long> ergebnis = new ArrayList<>();
while (rs.next()) {
ergebnis.add(rs.getLong(1));
}
return ergebnis;
liste.get(1);
liefert die Programm-ID des Programms mit der zweitgrößten Komplexität.public static String [][] analysieren() {
List<String> topTenKomplex=new ArrayList<>();
String topTen=new String("SELECT programm_id FROM Programm"+
"ORDER BY komplexität DESC LIMIT 10");
try{
Connection cn=null;
Class.forName(sDbDrv);
cn = DriverManager.getConnection(sDbUrl, sUsr, sPwd);
Statement st1=null;
ResultSet rs1=null;
st1=cn.createStatement();
rs1=st1.executeQuery(topTen);
while(rs1.next()){
topTenKomplex.add(rs.getString(1));
}
System.out.println(topTenKomplex.get(1));
}catch(Exception e){e.printStackTrace();}
}
java.sql.SQLException: After end of result set
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:506)
at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:869)
at daten.einlesen.ProgrammAnalyse.analysieren(ProgrammAnalyse.java:56)
at daten.einlesen.ProgrammAnalyse.main(ProgrammAnalyse.java:19)
Du musst schon das gleiche ResultSet verwenden, nicht einmal rs1 und dann rs.rs1=st1.executeQuery(topTen);
while(rs1.next()){
topTenKomplex.add(rs.getString(1));
}
}
public static void analysieren() {
String topTen = "SELECT programm_id FROM Programm"+
" ORDER BY komplexität DESC LIMIT 10";
try(Connection cn = DriverManager.getConnection(sDbUrl, sUsr, sPwd);
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(topTen)) {
List<String> topTenKomplex=new ArrayList<>();
while (rs.next()) {
topTenKomplex.add(rs.getString(1));
}
System.out.println(topTenKomplex.get(1));
} catch (SQLException ex) {
ex.printStackTrace();
}
}
was steht denn in dieser Zeile??at daten.einlesen.ProgrammAnalyse.analysieren(ProgrammAnalyse.java:56)
Ja ich hab für den Beispiel einfach den select von Robat eingefügt sonst ist die Abfrage komplizierter aber funktioniert.Ich habe eben noch ein Space vor ORDER BY eingefügt, ansonsten stimmt das SQL nicht.
Jetzt weiss ich nicht mehr..habe alles geändert nach mihe7 Vorschlag,ich glaube da stand auch topTenKomplex.add(rs.getString(1));Moin,
was steht denn in dieser Zeile??
VG Klaus
Was meinst du damit? Ich erzeuge Connection in jeder Methode wo ich sie brauch und zum Schluss schlisse. Ist das Falsch?Noch ein paar Anmerkungen: die Connection erzeugt man für gewöhnlich nicht jedesmal neu
[/code]
Mindestens in deiner gezeigten Methode schließt du nichts - das ist in jedem Fall falschWas meinst du damit? Ich erzeuge Connection in jeder Methode wo ich sie brauch und zum Schluss schlisse. Ist das Falsch?
Die Methode ist sehr lang ,deswegen zeige ich nur die Abschnitte die relevant sind,aber glaub mir die Conection schlisse ich))Mindestens in deiner gezeigten Methode schließt du nichts - das ist in jedem Fall falsch
Falsch wäre es, wenn es nicht funktioniertIch erzeuge Connection in jeder Methode wo ich sie brauch und zum Schluss schlisse. Ist das Falsch?
Wenn ich dich richtig verstanden habe ,wäre dann für mich besser eine Methode zu basteln die mir Verbindung bereitstellt.So was wieFalsch wäre es, wenn es nicht funktioniert
Wenn die Klasse (oder gar die Methode), die die Abfrage durchführt, auch die Verbindung aufbaut, sind diese Dinge stark gekoppelt (bilden also eine Einheit), obwohl sie logisch nicht zusammengehören (schwache Kohäsion). Das erklärte Ziel ist das genaue Gegenteil davon.
public static Connection eureVerbindungMeinHerr(){
String sDbUrl = MYSQLparameter.getURL();
String sUsr = MYSQLparameter.getUser();
String sPwd = MYSQLparameter.getPassword();
try{
Connection cn=DriverManager.getConnection(sDbUrl, sUsr, sPwd);
}catch(SQLException e){e.printStackTrace();}
return cn;
}
public static irgendeineMethode(){
Connection cn=eureVerbindungMeinHerr();
//hier mache ich etwas
cn.close()
}
class Users {
private static final String SQL_LOGIN =
"SELECT 1 FROM users WHERE username=? AND password=?";
private static final String SQL_COUNT =
"SELECT count(*) FROM users";
private Connection conn;
public Users(Connection conn) { this.conn = conn; }
public boolean login(String username, String password) throws SQLException {
try(PreparedStatement stmt = conn.prepareStatement(SQL_LOGIN)) {
stmt.setString(1, username);
stmt.setString(2, hash(password));
try(ResultSet rs = stmt.executeQuery()) {
return rs.next();
}
}
}
public int count() throws SQLException {
try(Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SQL_COUNT);
int result = 0;
if (rs.next()) { result = rs.getInt(1); }
return result;
}
}
}
Wenn ich in meinem Programm an einer Stelle alle Stunde mal eine DB-Abfrage machen müsste, dann würde ich da auch nicht rumeiern.
?!?für mein Programm ist es nicht nötig die Verbindungen
an mehrere users zu koppeln .
public void analyze() {
Connection conn = neueVerbindungAufbauen();
...
conn.close();
}
// vs
public void analyze(Connection conn) {
...
}
Das ist meine Angewohnheit von C. Da wird der Speicherplatz für neue Variable nur erteilt nicht geleert und deswegen kann neue Variable alles mögliche enthalten.Ich glaube in Java ist es anders aber bin mir nicht sicher.Wie ist es in Java?Die Initialisierungen mit null kannst Du Dir auch sparen.
[/code]
In lokalen Variablen steht auch in Java „nichts“ drin, man kann deshalb nicht lesend drauf zugreifen, bis sie zugewiesen sind.Das ist meine Angewohnheit von C. Da wird der Speicherplatz für neue Variable nur erteilt nicht geleert und deswegen kann neue Variable alles mögliche enthalten.Ich glaube in Java ist es anders aber bin mir nicht sicher.Wie ist es in Java?
Wo, was, wer?Schließt du die Connection nicht?