2016-11-20 4 views
1

Ich bin neu in Java und JDBC. Ich versuche, einen doppelten Wert von einer Datenbank über JDBC zu erhalten und eine globale Variable zu diesem Wert zu machen. Hier ist was ich getan habe.JDBC getDouble liefert 0.0

public class Console { 

    String sql; 
    Statement stmt; 
    Connection conn; 
    ResultSet rs; 

    //Category Total 
    public static double num; 

    public Console(){ 
      try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      System.out.println("Connecting to database..."); 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?autoReconnect=true&useSSL=false","user","password"); 
      stmt = conn.createStatement(); 
      System.out.println("Connected database successfully..."); 

      sql = "SELECT sum(a) FROM table"; 
      while(rs.next()) { 
       rs = stmt.executeQuery(sql); 
       num = rs.getDouble("sum(a)"); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     System.out.println(num); 
    } 

}

Wenn ich das Programm laufen druckt 0,0 obwohl der tatsächliche Wert nicht.

+0

Ich denke, das nicht nur 0.0 gibt, druckt es auch einen Stack-Trace wegen einer NullPointerException. Sie haben dieses Detail verpasst, und das hätte Ihnen auch einen Hinweis gegeben, das Problem selbst zu finden. – brummfondel

Antwort

3

Sie benötigen Ergebnis erhalten gesetzt vor auf der while-Schleife, und dann durchlaufen sie

rs = stmt.executeQuery(...); 
while (rs.next()) { 
    // and process your results row by row here... 
} 

Im anderen Fall (wie Sie entdeckt haben) Ihre rs Variable ungesetzt

Ihr Ergebnis set enthält keine Summe (a) als Spaltennamen. Sie können das Ergebnis positionsmäßig erhalten (z. B. getInt() kann eine Index-Ganzzahl annehmen) oder Ihre Ergebnisspalte umbenennen (z. B. sum(a) as sum FROM table) und so darauf verweisen.

+0

Danke für das Heads-Up, ich habe gerade das behoben, aber es druckt immer noch Null, was mich verwirrt. – Mike

1

Sie haben die ResultSet nicht mit der Ausführung der Abfrage initialisiert. Dann können Sie die Ergebnismenge wiederholen.

Sie haben die Ergebnisse in der Schleife erhalten, aber Sie müssen es tun, bevor Sie die Schleife erreichen.

0

Sie erhalten 0.0 wegen des Verhaltens des JDBC-Treibers.

Rückgabe: der Spaltenwert; wenn der Wert SQL NULL ist, der Wert zurückgegeben wird, ist 0

Um zu wissen, dass im letzten gelesenen Wert von Resultset null war, können Sie Methode rs.wasNull() Methode verwenden. Es wird True zurückgegeben, wenn der letzte gelesene Spaltenwert SQL NULL war und andernfalls false.

0

Es empfiehlt sich, berechneten Ergebnissen wie sum(a) eine column alias zuzuweisen und die Werte unter Verwendung dieses Alias ​​abzurufen.

Auch gute Praxis ist Java try-with-resources zu verwenden.

Die Try-mit-Ressourcen-Anweisung stellt sicher, dass jede Ressource am Ende der Anweisung geschlossen wird.

Auch, wenn Ihre SQL-Anweisung würde NULL zurückgeben, z für den Fall, ist die Tabelle leer oder keine Zeilen zu den Bedingungen in Ihrer WHERE Klausel gelten, kehrt die ResultSet.getDouble Methode den Wert 0.


sql = "SELECT sum(a) AS sum_a FROM table"; // assign alias sum_a to the expression sum(a) 
try(ResultSet rs = stmt.executeQuery(sql)) { // get a resultset object in a try-with-resources statement, to auto-close it at the end 
    rs.next(); // for the query you have, checking if there's a next row is actually not necessary; there's always a result for your query 
    num = rs.getDouble("sum_a"); // retrieve the column value by its alias 
} // rs will be closed for you at this point 
+1

Ein Downvote ohne Erklärung, das ist ziemlich lahm. Alle soliden Ratschläge in dieser Antwort IMO. –

+1

Ja, ich stimme zu .. +1. Ich habe diese Leute satt. –