0

我正在尝试将单词列表存储在数据库中。所有其他面向数据库的函数都运行良好,但是在循环中调用此特定方法时会返回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;
    }
}
4

1 回答 1

2

您需要首先调用 rs.next() 以确保结果集游标指向返回的 ResultSet 中的第一条记录。因此,替换以下调用:

ret = rs.getInt("frequency");

和 :

if(rs.next()){
ret = rs.getInt("frequency");
}
于 2013-07-13T14:02:25.863 回答