2011-02-11 108 views
0

我正在使用Apache DBCP獲取連接池,我每次都使用PoolingDataSource獲取連接。當我向數據庫中插入一個對象時它工作的很好,但是當我嘗試從數據庫中選擇一個元素時會發生問題:它總是返回一個DelegatingPreparedStatement和DelegatingResultSet,並且如果DelegatingResuletSet的next()方法執行,則會出現一個錯誤「java.sql .SQLException:無效光標狀態:標識的光標未打開標識的光標未打開「出現。我不知道爲什麼,有沒有人知道問題是什麼?我正在使用HSQLDB。該代碼是:java.sql.SQLException:光標狀態無效:標識的光標未打開標識的光標未打開

String strSql = "select * from " + strTableName + " where " + strColumnName 
    + " = ? "; 

PreparedStatement aPreparedStatement = con.prepareStatement(strSql); 

ResultSet aResultSet = null; 

/* 
* Execute the query 
*/ 
try 
{ 
    aPreparedStatement.setString(1, strValue); 

    aResultSet = aPreparedStatement.executeQuery(); 
} 
catch (SQLException theException) 
{ 
    aPreparedStatement.close(); 

    throw theException; 
} 
aPreparedStatement.close(); 

while (theResultSet.next()) 
{ 
    // do something else 
} 

感謝您的幫助, 艾克

回答

1

您關閉的PreparedStatement您試圖通過ResultSet迭代之前。我不認爲這是對的 - 我想你應該同時關閉它們,一旦你從ResultSet對象中檢索到所有結果。

編輯:見the API for close()

「注意:當一個Statement對象關閉,其當前的ResultSet對象,如果存在的話,也被關閉。」

0

關閉任何語句(Statement/PreparedStatement/CallableStatement)通常會關閉相關的ResultSet對象。所以嘗試先關閉ResultSet然後關閉PreparedStatement對象。