我正在尝试在数据库中存储单词列表。所有其他面向数据库的函数都运行良好,但是这个特定方法在循环中调用时会返回ResultSet is Closed
错误。我正在尝试模拟HashMap的方法结构。这是有问题的方法:
public int get(String key){
ResultSet rs = null;
int ret = -1;
try{
if(!running)
initialize();
rs = connection.createStatement().executeQuery("select frequency from Commonlist where word = '"+key+"'");
ret = rs.getInt("frequency");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
finally{
try{rs.close();}catch(Exception e){e.printStackTrace();}
return ret;
}
}
似乎把错误抛给了
ret = rs.getInt()
。我似乎在斗智斗勇,成为数据库世界的初学者,但每个人都曾经是初学者:)。
供参考,全班:
import java.sql.*;
import org.sqlite.*;
public class CommonList
{
private static Connection connection = null;
private static Statement query;
private boolean running = false;
public synchronized Connection getConnection(){
try{
if(running == false)
connection = DriverManager.getConnection("jdbc:sqlite:CommonList.db");
}
catch(Exception e){
e.printStackTrace();
}
running = true;
return connection;
}
public void initialize(){
try{
Class.forName("org.sqlite.JDBC");
connection = getConnection();
query = connection.createStatement();
query.setQueryTimeout(30);
query.executeUpdate("create table if not exists CommonList(word string,frequency integer)");
}
catch(Exception sqle){
sqle.printStackTrace();
}
}
public void put(String key,int frequency){
try{
if(!running)
initialize();
query.executeUpdate("delete from CommonList where word = '"+key+"'");
query.executeUpdate("insert into CommonList values('"+key+"',"+frequency+")");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
}
public int get(String key){
ResultSet rs = null;
int ret = -1;
try{
if(!running)
initialize();
rs = connection.createStatement().executeQuery("select frequency from Commonlist where word = '"+key+"'");
ret = rs.getInt("frequency");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
finally{
try{rs.close();}catch(Exception e){e.printStackTrace();}
return ret;
}
}
public void delete(String key){
try{
if(!running)
initialize();
query.executeUpdate("delete from CommonList where word = '"+key+"'");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
}
public String toString(){
//Test code
ResultSet rs =null;
try{
rs = connection.createStatement().executeQuery("select * from CommonList");
System.out.println("Word Frequency\n---------------------------");
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getInt(2));
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{rs.close();}catch(Exception e){e.printStackTrace();}
return "Java Wrapper for SQLite Database";
}
}
private void closeConnection(){
if(connection!=null)
try{connection.close();}catch(Exception e){e.printStackTrace();}
}
public void close(){
closeConnection();
running = false;
}
}
答案 0 :(得分:2)
您需要先调用rs.next()以确保结果集游标指向返回的ResultSet中的第一个记录。所以,替换下面的电话:
ret = rs.getInt("frequency");
with:
if(rs.next()){
ret = rs.getInt("frequency");
}