0

私は自分のアプリケーションで次の作業を行っています。この作業では、「porcobrar2012」と呼ばれる mysql データベース テーブルの値の合計を更新しようとしています。ただし、更新される唯一の値は、while ループで生成された最後の値です。なんで?すべての値は問題なく画面に出力されていますが、それらの値はデータベースで更新されていません。コードは次のとおりです。

BigDecimal total = new BigDecimal("0"); 
  try
{
        //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        //Connection connection=DriverManager.getConnection("jdbc:odbc:db1","","");
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection connection=DriverManager.getConnection("jdbc:mysql://localhost/etoolsco_VecinetSM?user=etoolsco&password=g7Xm2heD41");
        Statement statement=connection.createStatement();
        String query;
        query="SELECT * FROM porcobrar2012"; 
        ResultSet resultSet=statement.executeQuery(query);
    while(resultSet.next())
    {
    out.println(resultSet.getString(2)+"");out.println(resultSet.getBigDecimal(3)+"");out.println(resultSet.getBigDecimal(4)+"");out.println(resultSet.getBigDecimal(5)+"");out.println(resultSet.getBigDecimal(6)+"");out.println(resultSet.getBigDecimal(7)+"");out.println(resultSet.getBigDecimal(8)+"");out.println(resultSet.getBigDecimal(9)+"");out.println(resultSet.getBigDecimal(10)+"");out.println(resultSet.getBigDecimal(11)+"");out.println(resultSet.getBigDecimal(12)+"");out.println(resultSet.getBigDecimal(13)+"")out.println(resultSet.getBigDecimal(14)+"");out.println(resultSet.getBigDecimal(15)+"");
    total = resultSet.getBigDecimal(3).add(resultSet.getBigDecimal(4)).add(resultSet.getBigDecimal(5)).add(resultSet.getBigDecimal(6)).add(resultSet.getBigDecimal(7)).add(resultSet.getBigDecimal(8)).add(resultSet.getBigDecimal(9)).add(resultSet.getBigDecimal(10)).add(resultSet.getBigDecimal(11)).add(resultSet.getBigDecimal(12)).add(resultSet.getBigDecimal(13)).add(resultSet.getBigDecimal(14)).add(resultSet.getBigDecimal(15));
    String query1;
    query1="UPDATE porcobrar2012 SET total=total";
    PreparedStatement ps = connection.prepareStatement(query1);
    ps.executeUpdate();

    out.println(total);

}

    connection.close();
statement.close();




} 

  catch (Exception e) 
{
      //e.printStackTrace();
      out.println(e.toString());
}
4

1 に答える 1

1

これは、更新によって既存の結果セットが閉じられるためです。しかし、データベース、ループ、BigDecimalsで、事前のクエリなしで単一のUPDATEステートメントで加算を行わない理由を尋ねます。データベースプログラミングのルール1は、「必要以上にデータを移動しない」です。「UPDATEporcobrar2012SETa = b + c + d+...」と書くだけでも何倍も効率的です。また、Class.forName()呼び出しも削除できます。これは何年も必要ありませんでした。

于 2012-06-24T21:36:34.507 に答える