• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Sprichwörter und Redewendungen sind das Thema unseres Monatswettbewerbes. Nähere Informationen dazu gibt es natürlich auch, und zwar auf dieser Seite ---> Klick

Java und SQL: Ausgabe klappt nicht

powerlocke

Kaiser Wilhelm
Registriert
20.07.08
Beiträge
173
Hallo liebe Leute!

Ich will in meinem Java-Applet eine Abfrage an eine Datenbank machen. Das Ergebnis oder die Ergebnisse sollen dann nacheinander ausgegeben werden.

Der relevante Quelltext schaut so aus:

rs = stmt.executeQuery("SELECT * FROM geb WHERE geb.id = 1781965");
while (rs.next() == true ){
if (rs.next()!=true){break;}
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
System.out.println(rs.getString(4));
}

Gebe ich die Query direkt in phpmyadmin ein läuft alles einwandfrei, nur hier im Java-Applet gehts nicht.

Ich benutze genau die gleichen Quellcode-Zeilen in einem anderen Programm (nur die Abfrage ist da etwas anders) und da gehts.

Ich arbeite mit der java.sql-Klasse, habe überall neuste Versionen usw... woran könnte es noch liegen?

Liebe Grüße

Niky
 

bezierkurve

Halberstädter Jungfernapfel
Registriert
12.06.05
Beiträge
3.860
Und wo genau scheitert es? Exception?

Btw, was bezweckst du damit …:
Code:
while (rs.next() == true ){
if (rs.next()!=true){break;}
     // ...
}
 

powerlocke

Kaiser Wilhelm
Registriert
20.07.08
Beiträge
173
Ah, hätt ich vielleicht schreiben sollen: es scheitert letzten Endes daran, dass er nichts ausgibt, sprich: das Programm läuft normal durch, sollte aber eigentlich zwischendurch die ersten vier Ergebnisse des ResultStatement (rs) ausgeben....

Durch die while mit Abbruchbedingung, dass es einfach keinen weiteren Ergebniswert für rs.next() gibt, entsteht erst die Abfrage nach Antworten der Datenbank.

_edit: Er gibt keine Fehler aus, keine Exception o.Ä.
 

bezierkurve

Halberstädter Jungfernapfel
Registriert
12.06.05
Beiträge
3.860
Durch die while mit Abbruchbedingung, dass es einfach keinen weiteren Ergebniswert für rs.next() gibt, entsteht erst die Abfrage nach Antworten der Datenbank.

… du „blätterst“ in deinem Code ja aber immer zwei mal weiter. Ist das tatsächlich gewollt? Wozu genau das
Code:
if (rs.next()!=true){break;}
?
 

creative7even

Jerseymac
Registriert
23.02.05
Beiträge
454
Code:
while (rs.next() == true ) {   // 1. mal
  if (rs.next()!=true){break;} // 2. mal

Wie bezierkurve schon sagte - du setzt den Cursor 2x weiter - einmal in der while-Bedingung, das 2te mal im Schleifenkörper.
Dabei reicht die 1. Bedingung in der Schleife (while (rs.next() == true )). Der Grund warum du also kein Ergebnis bekommst könnte daran liegen, dass du mit der Query 1 oder 2 Datensätze filterst - den Cursor aber beim erreichen der Schleife schon wieder weiter schiebst... deshalb wird auch nichts ausgegeben.
 

powerlocke

Kaiser Wilhelm
Registriert
20.07.08
Beiträge
173
oh man und ich such und such... das brauchte ich bei dem Programm aus dem ich das kopiert habe und habs vergessen zu löschen... ich danke euch!
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
Übrigens mal am Rande:
1.) Ein Boolean muss man doch mit auf "==true" vergleichen. Denn der Ausdruck xyz==true wird genau dann true, wenn xyz den Wert true hat. Also ist "xyz==true" äquivalent zu einfach "xyz". Und statt "xyz!=true" oder "xyz==false" schreibt man am besten einfach "!xyz".

2.) Wenn ich ein Break in einer Schleife sehe, bekomme ich das kalte Grausen. Ich kann nur allen Programmieranfängern raten, vernünftig strukturiert zu programmieren und nicht mit Sprungbefehlen (Relikten einer Urzeit der Programmierung) zu hantieren. (Lediglich das bescheuert realisierte C-Switch-Konstrukt erfordert den Einsatz von break.)
 

knalli

Stechapfel
Registriert
19.01.10
Beiträge
159
Das liegt daran, dass das Break auch unnötig ist. Dafür ist ja while(rs.next()) da. Konzept von einer Preloop nicht verstanden?:innocent:

Ich empfehle übrigens außerordentlich (vor allem ein Applet, Achtung Speicher) eine Verwendung von guten Fehlerbehandlungen (im Kontext von JDBC auch typischer Boilercode, weil er leider umfangreich ist). Außerdem muss man ja eh die Ressourcen wieder vernünftigt schließen (Stichwort finally).

Ein Konstrukt, welches einerseits übersichtlich, gleichzeitig aber alles abdeckt, könnte sein:
Code:
private Collection<Long> getIdsByName(Connection connection, String name) {
  PreparedStatement pstm = null;
  ResultSet rs = null;
  try {
    pstm = connection.prepareStatement("SELECT id from table where name = ?");
    pstm.setString(1, name);
    rs = pstm.executeQuery();

    List<Long> result = new ArrayList<Long>();
    while (rs.next()) {
      // do what ever you want with rs.get*()
      result.add(rs.getLong(1));
    }

  } catch (SQLException e) {
    handleSQLException(e); // Methode, die die exception annimmt und verarbeitet, etwa ausloggen, ...
  } catch (Exception e) {
    // wahlweise auch Throwable, kommt auf den Kontext an
    handleException(e); // handles alles andere ab - kann natürlich auch ganz weggelassen werden
  } finally {
    closeResultSet(rs);
    closeStatement(pstm);
  }
  return Collections.emptyList();
}

private void closeResultSet(ResultSet rs) {
  try {
    if (rs != null) { rs.close(); }
  catch (Exception ignored) {}
}

// analog für Statement
 

powerlocke

Kaiser Wilhelm
Registriert
20.07.08
Beiträge
173
okay, danke für die vielen tipps, das mit dem boolean wusste ich noch nicht ;)

@knalli: ich habe bereits ein ähnliches konstrukt, wie von dir vorgeschlagen, eingebastelt, aber trotzdem danke!

hab mittlerweile auch alles so wie ichs haben wollte, daher kann dieses thema auch geschlossen werden!

falls mir noch jemand helfen möchte: ich habe einen anderen beitrag bei dem ich noch tipps zu pdf und email brauche

http://www.apfeltalk.de/forum/java-pdfs-erstellen-t287975.html

danke!

niky