2014-02-13 40 views
2

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

所以这段代码确实有效,但不是所有的时间。我已经多次运行它,大约有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(); 
    } 
} 

} 

回答

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对象反映。

TYPE_SCROLL_INSENSITIVE

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

TYPE_SCROLL_SENSITIVE

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

请参阅Updating ResultSet了解更多详情。

0

您的表是否有PRIMARY KEY?

指定结果集是可更新的并不能保证你得到的 结果集实际上是可更新的。不支持 的驱动程序支持可更新的结果集将返回一个只读的驱动程序。在 另外,为了得到可更新的结果集,查询一般必须将 指定为所选列之一的主键,并且它应该从只有一个表中选择列的 。

+0

感谢您对Marius的评论,但自从我写这段代码以来,我已经有一段时间了,我不可能再记起来了。基本上我完成这个练习后没有碰到JDBC!我正在开发一个专门用于休眠的项目。 – YoNuevo

+0

Np。超级,你现在正在做一个项目!我正在阅读一本关于JDBC的书“Java数据库编程圣经”。它有例子,很简单。 :) – Willmore