2016-11-20 3 views
1

私はJavaとJDBCが初めてです。 私はJDBCを介してデータベースからdouble値を取得しようとしていて、グローバル変数をその値と同じにしようとしています。ここに私がしたことがあります。JDBC getDoubleは0.0を返します

Iは実際の値ではないが、それは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); 
    } 

}。 (あなたが発見したとして)

+0

私はこれがちょうど0.0ない与え推測値を返します。 NullPointerExceptionが原因です。あなたはその細部を忘れてしまいました、そして、これはまた、あなた自身で問題を見つけるヒントを与えました。 – brummfondel

答えて

3

あなたはあなたの結果はwhileループにを設定取得する必要があり、その後、反復は、そうでない場合

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

を通して、あなたのrs変数が未設定の

あなたの結果であり、 setは列名としてsum(a)を含みません。結果を位置的に取得することができます(例:getInt()はインデックス整数を取ることができます)。結果列の名前を変更してください(例:sum(a) as sum FROM tableを選択)。

+0

ヘッドアップのおかげで、私はそれを修正しましたが、それはまだ私を混乱させるゼロを印刷します。 – Mike

1

クエリを実行する際にResultSetを初期化していません。結果セットをループすることができます。

sql = "SELECT sum(a) FROM table"; 
PreparedStatement preparedStatement = connection.prepareStatement(sql); 
ResultSet rs = preparedStatement.executeQuery(); 
while (rs.next()) { 
    num = rs.getDouble("sum(a)"); 
} 

ループ内で結果を取得していますが、ループに到達する前に行う必要があります。

0

JDBCドライバの動作により、0.0が表示されています。 からjava doc

戻り値:列の値。値がSQL NULLの場合、 が返される値は、最後の読み取り値がResultSetからヌルだった、あなたはメソッドrs.wasNull()メソッドを使用することができることを知っている0

です。読み込まれた最後のカラム値がSQL NULLの場合はtrueを返し、そうでない場合はfalseを返します。

0

column aliasを計算結果にsum(a)のように割り当て、そのエイリアスを使用して値を取得することをお勧めします。

また、Javaのtry-with-resourcesを使用することをお勧めします。

try-with-resourcesステートメントは、各リソースがステートメントの最後に閉じられるようにします。

さらに、SQL文がNULLを返すとします。場合には、テーブルが空であるか、行があなたのWHERE句で条件に当てはまらない、ResultSet.getDouble方法は、それはまた、スタックトレースを出力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

説明なしのdownvote、それはかなり不自由です。この回答のすべての固体アドバイスIMO。 –

+1

うん、私は同意する.. +1。私はこれらの人々にうんざりです。 –

関連する問題