2017-08-14 43 views
1

我做的語句:結果集不可更新

Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
try(ResultSet results = statement.executeQuery(String.format("SELECT id, id2 FROM SETTINGS WHERE instance3 = %s, instance.getId()))); 

但我得到這個:

com.mysql.cj.jdbc.exceptions.NotUpdatable:結果集不可更新(被引用的表沒有主鍵)。此結果集必須從使用結果集類型ResultSet.CONCUR_UPDATABLE創建的語句中獲得comd,查詢必須選擇一個表,不能使用函數並且必須從該表中選擇所有主鍵。

任何想法爲什麼會發生這種情況?

+1

的可能重複:https://stackoverflow.com/questions/22271475/jdbc-deleting-an-entry-primary-keys-concur-updatable-issues – tima

+1

爲什麼你使用'String.format'爲設置參數值?這是不安全的,並向您打開SQL注入。 –

+1

異常消息非常明確,您選擇的表沒有主鍵(或者您未選擇所有主鍵列)。請在您的問題中包含所有相關的DDL。 –

回答

-1

您正在創建一個允許結果集可更新的語句。默認的ResultSet對象不可更新,並且只有一個向前移動的遊標。所以你需要使用下面的代碼片段,其中con是一個有效的Connection對象。它演示瞭如何創建一個可滾動且不被其他人更新的結果集,並且這是可更新的。

來自:http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

您可以更從上面的源文件鏈接,參閱。

PreparedStatement prepStmt= conn.prepareStatement(query, 
    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
+1

你真的讀過這個問題嗎,create語句具有相同的屬性:'createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE)' –