javajdbcjdbc-odbc

No Data found exception while assigning the result set


I'm writing a code to get the count of values in a column and using this result I need to create a jtable in my swing. Right now when I print my result directly with a sysout there are no issues, the data is getting printed directly. But when I start assigning the variables, there is an Exception thrown. Below is my code.

//to run a query and build user
public List<User> searchUser(String USERNAME, String action) throws Exception {
        List<User> list = new ArrayList<>();

        PreparedStatement pst = null;
        ResultSet rs = null;

        try {

                USERNAME = "%" + USERNAME + "%";
                String query = "select count(*) as cnt, USERNAME from [Sheet1$] GROUP BY USERNAME";
                pst = myConn.prepareStatement(query);
                // pst.setString(1, USERNAME);
                rs = pst.executeQuery();
                String sum = null;
                while (rs.next()) {
                    User tempUser = convertRowToUser(rs);
                    list.add(tempUser);
                }
                System.out.println(sum);

            return list;
        } finally {
            close(pst, rs);
        }
    }

//Convert row data to user data

private User convertRowToUser(ResultSet rs) throws SQLException {
        System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
        int resultInt = rs.getInt(1);
        String lastName = rs.getString(2);
        System.out.println(lastName + "\t" + resultInt);
        User tempUsers = new User(lastName, resultInt);

        return tempUsers;
    }

//My main method

public static void main(String[] args) throws Exception {
        UsersDAO dao = new UsersDAO();
        dao.searchUser("abc", "count");
    }

When I comment out the below lines, printing the last name and resultInt and return null it is printing the data in console.

    int resultInt = rs.getInt(1);
    String lastName = rs.getString(2);
    System.out.println(lastName + "\t" + resultInt);
    User tempUsers = new User(lastName, resultInt);

I've added try-catch blocks as shown below to see the stacktrace and it showed me the below result.

private User convertRowToUser(ResultSet rs) {
        try {
            System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String lastName = null;
        try {
            lastName = rs.getString(2);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int resultInt = 0;
        try {
            resultInt = rs.getInt(1);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(lastName + "\t" + resultInt);

        User tempUsers = new User(lastName, resultInt);

        return null;
    }

The exception is as below.

16  abc
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:154)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:161)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
null    0
8   edf
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:154)
null    0
8   rgtd
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:161)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:154)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:161)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
null    0
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:154)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
8   rtfgt
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    at org.swing.classes.UsersDAO.convertRowToUser(UsersDAO.java:161)
    at org.swing.classes.UsersDAO.searchUser(UsersDAO.java:103)
    at org.swing.classes.UsersDAO.main(UsersDAO.java:193)
null    0
null

If i just print the values(without assigning) the output is as below.

16  abc
8   edf
8   rgtd
8   rtfgt
null

please let me know where am I going wrong and how can I fix this.

Thanks


Solution

  • This is a common caveat (bug?) of JDBC-ODBC bridge driver for MS Access. You should read the data just once for one result set row and store it in local variables:

    private User convertRowToUser(ResultSet rs) throws SQLException {
        int resultInt = rs.getInt(1);
        String lastName = rs.getString(2);
        System.out.println(resultInt + "\t" + lastName);
        User tempUsers = new User(lastName, resultInt);
        return tempUsers;
    }