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
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;
}