结果集显示为空,但 table 中至少有 1 条记录
ResultSet showing empty but there is at least 1 record in the table
问题 我的结果集是空的,但我知道 table ("tblStudents")?
中至少有 1 条记录
代码 :
package smartdatabase;
/**
*
* @author travi
*/
import java.sql.*;
public class Conn {
private Connection connect = null;
private Statement stmt = null;
public Conn() {
}
public void getStudents() {
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
connect = DriverManager.getConnection("jdbc:derby://localhost:1527/SmartData", "root",
"password");
String sql;
sql = "SELECT FirstName, Surname FROM tblStudents";
stmt = connect.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
}else{
System.out.println("Empty ResultSet");
}
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我试过检查区分大小写,但似乎不是问题所在。
我也试过 ResultSet rs = stmt.executeQuery(sql);
但没有任何改变。有什么想法吗?
rs.next()
方法会将当前对象的指针移动到下一行。
因此,当您放置条件 if (rs.next())
时,指针仅指向下一行,该行为空,正如您所说的,数据库中有一行条目。
第一次调用 next() 方法时,结果集 pointer/cursor 将移至第一行。第二次调用 next() 方法时,结果集游标将移动到第二行。这样就过去了。
您可以调用 first() or beforeFirst()
方法将 ResultSet 游标重置回第一行。
您可以在以下位置找到更多说明:ResultSet---isBeforeFirst()---AND--first()
现在检查是否为空需要按下面的方式实现,将光标移动到第一个位置,如果结果集为空则return false:
选项 1:
if (!rs.first()) {
System.out.println("Empty ResultSet");
} else {
do {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
} while (rs.next());
}
更新:
选项 2:
if (!rs.isBeforeFirst()) {
System.out.println("Empty ResultSet");
} else {
do {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
} while (rs.next());
}
选项 3:
if (!rs.isBeforeFirst() && rs.getRow() == 0) {
System.out.println("Empty ResultSet");
} else {
do {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
} while (rs.next());
}
更新 2:
对于 DERBY 数据库,使用 createStatement
中的以下参数:
// Replace : stmt = connect.createStatement();
stmt = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
然后使用上面提到的选项1。
问题 我的结果集是空的,但我知道 table ("tblStudents")?
中至少有 1 条记录代码 :
package smartdatabase;
/**
*
* @author travi
*/
import java.sql.*;
public class Conn {
private Connection connect = null;
private Statement stmt = null;
public Conn() {
}
public void getStudents() {
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
connect = DriverManager.getConnection("jdbc:derby://localhost:1527/SmartData", "root",
"password");
String sql;
sql = "SELECT FirstName, Surname FROM tblStudents";
stmt = connect.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
}else{
System.out.println("Empty ResultSet");
}
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我试过检查区分大小写,但似乎不是问题所在。
我也试过 ResultSet rs = stmt.executeQuery(sql);
但没有任何改变。有什么想法吗?
rs.next()
方法会将当前对象的指针移动到下一行。
因此,当您放置条件 if (rs.next())
时,指针仅指向下一行,该行为空,正如您所说的,数据库中有一行条目。
第一次调用 next() 方法时,结果集 pointer/cursor 将移至第一行。第二次调用 next() 方法时,结果集游标将移动到第二行。这样就过去了。
您可以调用 first() or beforeFirst()
方法将 ResultSet 游标重置回第一行。
您可以在以下位置找到更多说明:ResultSet---isBeforeFirst()---AND--first()
现在检查是否为空需要按下面的方式实现,将光标移动到第一个位置,如果结果集为空则return false:
选项 1:
if (!rs.first()) {
System.out.println("Empty ResultSet");
} else {
do {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
} while (rs.next());
}
更新:
选项 2:
if (!rs.isBeforeFirst()) {
System.out.println("Empty ResultSet");
} else {
do {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
} while (rs.next());
}
选项 3:
if (!rs.isBeforeFirst() && rs.getRow() == 0) {
System.out.println("Empty ResultSet");
} else {
do {
String Firstname = rs.getString("Firstname");
String Surname = rs.getString("surname");
System.out.println(Firstname + " " + Surname);
} while (rs.next());
}
更新 2:
对于 DERBY 数据库,使用 createStatement
中的以下参数:
// Replace : stmt = connect.createStatement();
stmt = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
然后使用上面提到的选项1。