簡體   English   中英

JDBC和可更新的ResultSet

[英]JDBC and updatable 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();
    }
}

}

嘗試以下更改:

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

結果可以滾動; 它的光標可以相對於當前位置向前和向后移動,並且可以移動到絕對位置。 結果集反映在結果集保持打開狀態時對基礎數據源所做的更改。

有關更多詳細信息,請參考更新ResultSet

您的桌子上有PRIMARY KEY嗎?

指定結果集是可更新的並不能保證您得到的結果集實際上是可更新的。 不支持可更新結果集的驅動程序將返回只讀的結果。 此外,要獲取可更新的結果集,查詢通常必須將主鍵指定為所選列之一,並且它只能從一個表中選擇列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM