我无法从ResultSet
对象获取数据。这是我的代码:
String sql = "SELECT type FROM node WHERE nid = ?";
PreparedStatement prep = conn.prepareStatement(sql);
int meetNID = Integer.parseInt(node.get(BoutField.field_meet_nid));
prep.setInt(1, meetNID);
ResultSet result = prep.executeQuery();
result.beforeFirst();
String foundType = result.getString(1);
if (! foundType.equals("meet")) {
throw new IllegalArgumentException(String.format("Node %d must be of type 'meet', but was %s", meetNID, foundType));
}
错误跟踪:
Exception in thread "main" java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5656)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5576)
at nth.cumf3.nodeImport.Validator.validate(Validator.java:43)
at nth.cumf3.nodeImport.Main.main(Main.java:38)
我在这里做错了什么?
答案 0 :(得分:139)
基本上,您将光标定位在第一行之前,然后请求数据。您需要将光标移动到第一行。
result.next();
String foundType = result.getString(1);
通常在if语句或循环中执行此操作。
if(result.next()){
foundType = result.getString(1);
}
答案 1 :(得分:9)
每个答案都使用.next()或使用.beforeFirst()然后使用.next()。但为什么不呢:
result.first();
所以你只需将指针设置为第一条记录并从那里开始。它可以从java 1.2开始使用,我只是想为ResultSet存在一个特定记录的任何人提及它。
答案 2 :(得分:6)
您必须先执行result.next()才能访问结果。这是一个非常常见的习惯用法
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
int foo = rs.getInt(1);
...
}
答案 3 :(得分:2)
您必须先致电next()
,然后才能开始阅读第一行的值。 beforeFirst
将光标放在第一行之前,因此无法读取数据。
答案 4 :(得分:2)
如果你创建一个包含所有查询方法的类(包括在不同的包中),那么最好不要在每个类中键入所有进程,而只需从该类调用该方法。
答案 5 :(得分:1)
在请求数据之前,您需要将指针移动到第一行:
result.beforeFirst();
result.next();
String foundType = result.getString(1);