2017-01-22 71 views
2

設置

我爲我的服務器數據庫使用JDBC SQLite如何檢查值存在/爲什麼ResultSet在SQLite中關閉?

我所試圖做的

我要檢查,如果一個值(例如IDusername)在表中已經存在。

我的代碼

PreparedStatement preparedStatement = connection.prepareStatement("select * from " + tableName + " where " + columnName + "=? limit 1"); 
preparedStatement.setString(1, value); 
ResultSet resultSet = preparedStatement.executeQuery(); 
resultSet.next(); 
try { // this was just for testing and is dumb because it prints an error every time the value does not exist. 
     // my code actually wasn't wrong. I just tested it badly .. 
     // it's replacable with if (resultSet.next()) 
    resultSet.getString(1); 
    System.out.println("check true"); 
    return true; 
} catch (Exception e) { 
    e.printStackTrace(); 
    System.out.println("check false"); 
    return false; 
} 

這裏我要檢查,如果一個特定的value在我column(Name)已經存在於我的table

的問題

此代碼將總是拋出一個SQLException: 「ResultSet的封閉」 在resultSet.getString(columnName)。這個值是否已經存在於表格中並不重要。我的查詢也可能是錯誤的,因爲我沒有得到我應該在select之後放置的內容。我有一次1那裏,但每個人都使用*爲「全部」,它沒有改變。我認真沒有得到this,因爲這對我來說太複雜,我只是想知道什麼select後的說法有..

途徑

我嘗試了很多東西,閱讀了大量的線程,但我遇到的唯一的事情是,我需要先撥打resultSet.next(),並且ResultSet不會拋出ResultSet closed例外,但它沒有改變任何東西。 如果有更好的方法來檢查表中是否存在某個值,請告訴我。

可視化

a table 我這裏有一個表(NULL的並不重要,他們可能是一些隨機值),我想檢查ggffvgvg存在與否。

完整的堆棧跟蹤

java.sql.SQLException: ResultSet closed 
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69) 
at org.sqlite.core.CoreResultSet.markCol(CoreResultSet.java:96) 
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:436) 
at Database.check(Database.java:50) 
at ClientHandler.run(ClientHandler.java:72) 
+0

您已將您的列名添加到單引號中,將其轉換爲字符串文字。 –

+0

之前,我得到「列columnName不存在」異常,即使它 – creativecreatorormaybenot

+0

我總是將ResultSet.next()調用包裝到一個if。它返回true,如果實際上有一個新的行被讀取。只有從結果集中讀取值 –

回答

2

resultSet.next()返回一個布爾值,它告訴你是否有下一個記錄或沒有。忽略這個返回的值就像用火箭發射器拍攝自己的腳。

所以,如果你正在尋找的價值不在結果集,(因爲它確實是沒有,或者因爲你沒有要求它正確)resultSet.next()回報false,和你的代碼炸燬,但你收到的例外。

resultSet.getString(1)子句將結果集取的第一列,(如果有當前行),它會返回給你假設,它實際上是一個字符串。大多數表的第一列通常是一個整數或其他類型的鍵數據類型,這意味着它很少是一個字符串。如果你幸運的話,這將是JDBC驅動程序可以轉換爲字符串的東西,但是通過假設你正在誘惑你的命運。

如果您只打算檢查單個列的值,那麼您的查詢語句只能選擇該列。這意味着,而不是

"select * from " + tableName + " where " + columnName + "=? limit 1"

你必須做

"select " + columnName + " from " + tableName + " where " + columnName + "=? limit 1"

不過,如果我知道你正在努力實現正確的東西,你甚至都不需要獲取現場和檢查它的價值。只需truefalse結果resultSet.next()應該就足夠了。

+1

是的,我告訴他,在評論以及...似乎還有另一個問題('.next()'總是返回false ) –

+0

它現在有效。我的代碼沒有錯,但我只是測試它錯了。我只是接受了你的答案,因爲它是唯一的答案,我的問題得到了解決。其實@MichaelRitter爲我解決了這個問題,因爲他在評論中指出我可能以錯誤的方式使用我的SQLite查看器(而不是重新啓動服務器/更新服務器上的數據庫)。我只是放了try catch代碼,因爲我想查看是否有錯誤並獲得一些反饋。我知道我可以只是放(如果(resultSet.net()),也沒關係,如果我把'*'或我的''columnName'。謝謝隊友! – creativecreatorormaybenot

+0

@MichaelRitter如果你想轉你的評論成爲答案,那麼OP可能會不接受我的並接受你的答案。 –