JDBC和可更新的ResultSet

时间:2014-02-13 10:44:35

标签: java jdbc updates resultset

我正在学习一些关于JDBC以及如何与数据库交互的知识。我得到了基础知识,但现在遇到了可更新结果集的问题。在这个练习中,我必须检查数据库中每种啤酒的库存,并添加50。

所以这段小代码确实有用,但不是所有的时间。我运行了好几次,大约50%的时间股票实际上涨了。检查这个我写了另一个小的while循环,打印一个包含必要数据的表。任何想法为什么它在100%的时间都不起作用?

数据库中有1071条记录,我在获得结果后立即运行了这段代码。我应该在再次运行之前等待吗?

package stockbier;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class bierenstock {

public static void main(String[] args) {

try (Connection con = DriverManager.getConnection(
            "jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
    PreparedStatement stmt = con.prepareStatement
        ("select * from Beers", 
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_UPDATABLE);) {

    ResultSet rs = stmt.executeQuery();
    while (rs.next()) {
            // edited int stock
        int stock = rs.getInt("Stock") + 50;
        rs.updateInt("Stock", stock);
        rs.updateRow();

    }

    rs.close();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

2 个答案:

答案 0 :(得分:0)

尝试以下更改:

public static void main(String[] args) {

try (Connection con = DriverManager.getConnection(
        "jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
PreparedStatement stmt = con.prepareStatement
    ("select * from Beers", 
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);) {

ResultSet rs = stmt.executeQuery();
while (rs.next()) {
    int stock = rs.getInt("Stock") + 50;
    rs.updateInt("Stock", stock);
    rs.updateRow();
}

} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    if (stmt != null) { stmt.close(); }
}    
}    

ResultSet对象的类型在两个区域中确定其功能级别:可以操作游标的方式,以及如何对ResultSet对象反映对基础数据源的并发更改。 / em>的

TYPE_SCROLL_INSENSITIVE

  

结果可以滚动;它的光标可以向前和向前移动   相对于当前位置向后,它可以移动到   绝对的位置。结果集对所做的更改不敏感   它是打开时的基础数据源。它包含行   在查询执行时或作为查询时满足查询   检索行。

TYPE_SCROLL_SENSITIVE

  

结果可以滚动;它的光标可以向前和向前移动   相对于当前位置向后,它可以移动到   绝对的位置。结果集反映了对此所做的更改   结果集保持打开状态时的基础数据源。

有关详细信息,请参阅Updating ResultSet

答案 1 :(得分:0)

你的桌子有PRIMARY KEY吗?

  

指定结果集是可更新的并不能保证   你得到的结果集实际上是可更新的。没有的司机   支持可更新结果集将返回只读结果集。在   另外,为了获得可更新的结果集,通常必须进行查询   将主键指定为所选列之一,它应该   只从一个表中选择列。