2010-03-18 49 views
2

我使用的是Java包裝SQLite的所謂SQLiteJDBC - 這可能對任何答案一定的影響...SQLite的+ Java的:表中未更新

我有我展示了一個表中的GUI,在該用戶界面中,我爲該表的單個行的字段提供了一個按鈕。當我救我改變我做這...

Statement stmt = connection.createStatement(); 
stmt.execute("update 'tableName' set 'fieldName'=1 where userid=1"); 

int updateCount = stmt.getUpdateCount(); 

我的連接是有效的,我沒有得到任何異常拋出,表明一行已更新getUpdateCount()返回「1」。但是我的表沒有更新。我花了最近幾個小時試圖弄清楚發生了什麼,但我沒有任何運氣。幫幫我!!

UPDATE

的問題似乎是,它沒有提交修改我做。在應用程序運行時,我的更改是可見的,但只要關閉應用程序並重新打開它或直接檢查數據庫,我的更改就會丟失,我們又回到原點。這是怎麼回事??!

自動提交設置爲true,如果我將它設置爲false,並嘗試提交我得到拋出的異常。

+0

tableName和fieldName是變量或你的表和字段的實際名稱?如果你只需要連接它們的變量 – LB40 2010-03-18 20:10:35

回答

5

我的問題是,我是依靠垃圾收集清理我的使用結果集,我串形成沒有明確地關閉它們。

在訪問表的SQLite中鎖定整個數據庫,所以這些使用的仍然「打開」的ResultSet阻止我在讀取其內容後獲得對錶的寫入訪問。

如果您遇到此問題並且正在使用SQLite,那麼只需在每個ResultSet上調用close()即可。 (你也可以嘗試對任何PreparedStatements進行同樣的操作,我假設它們也會關閉它們用於創建的任何ResultSet,但我沒有試驗過驗證這一點。)

+0

+1,有同樣的問題,這真的很有幫助! – 2012-01-04 23:01:28

3

我嘗試使用sqlitejdbc-v056.jar您的例子,它工作得很好,即使是使用單引號。


你可以重寫你的電話使用executeUpdate,但這不應該有所作爲:

int updateCount = 
     stmt.executeUpdate("update 'tableName' set 'fieldName'=1 where userid=1"); 


確保使用setAutoCommit(應該默認爲true反正)

connection.setAutoCommit(true); 

或在更新後明確執行commit

connection.commit(); 


仔細檢查您是否連接到正確的數據庫。如果問題仍然沒有解決,嘗試更新後和之前執行對記錄一個SELECT,看看是否值已更改。


原來的答覆

您是否嘗試刪除您tableNamefieldName周圍的單引號?

這些將作爲字符串以其他方式處理,這使得沒有SENCE。從documentation:

字符串常量被封閉在單引號(')

+0

我上面的SQL對於我的真實例子來說工作得很好,其中表名是'foo.bah'的形式。使用'fieldName'引用是沒有必要的,但似乎無論有沒有好的工作。 – 2010-03-19 10:46:41

+0

@本L:請檢查我編輯的答案。 – 2010-03-20 07:51:21