ResultSet.next()抛出SQLException:结果集已关闭

时间:2013-05-04 15:00:01

标签: java ms-access jdbc

我尝试调试代码并阅读Oracle文档,但我没有看到为什么结果集会被关闭的原因。

 Statement statement = DatabaseConnector.connect();
    String sql = "Select * from Room where Room_Type like '*"+roomType+"*' "+availability;
    boolean foundResults = statement.execute(sql);
    if(foundResults){
    ResultSet rs = statement.getResultSet();
    StringBuilder row = new StringBuilder();
    if(rs!=null){
    while(rs.next()){

2 个答案:

答案 0 :(得分:1)

RE:SQLException

我不太确定DatabaseConnector在问题代码中应该做什么,但以下测试代码对我有效。

RE:通配符

在Access应用程序本身中的查询中使用LIKE运算符时,星号*是要使用的通配符。从其他应用程序查询ACE(Access)数据库时,需要使用“标准”百分比%通配符。请注意,以下代码使用%;使用*将不起作用。

import java.sql.*;

public class JDBCQuery {
    public static void main( String args[] )
    {
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection conn = DriverManager.getConnection(
                    "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};" + 
                    "Dbq=C:\\Users\\Public\\Database1.accdb;");
            String RoomTypeToMatch = "suite";
            PreparedStatement s = conn.prepareStatement(
                    "SELECT Room_No, Room_Type " +
                    "FROM Room WHERE Room_Type LIKE ?"
                    );
            s.setString(1, "%" + RoomTypeToMatch + "%");
            s.execute();
            ResultSet rs = s.getResultSet();
            if (rs!=null)
            {
                while (rs.next())
                {
                    System.out.println("[Room_No]: " + rs.getString(1) +
                            ", [Room_Type]: " + rs.getString(2));
                }
            }
            s.close();
            conn.close();
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

SQL LIKE个通配符表示为%而不是*

String sql = 
    "Select * from Room where Room_Type like '%"+roomType+ "%' "+availability;

除此之外:始终使用Prepared Statement来防止SQL注入攻击