Answers:
没错,最初ResultSet
的光标指向第一行之前,如果第一次调用next()
return false
,则没有数据ResultSet
。
如果使用此方法,beforeFirst()
则由于它现在已定位在第一行之后,因此可能必须在复位后立即调用。
isBeforeFirst()
来测试是否有返回的行而不前进光标,然后正常进行。
假设您正在使用一个新返回ResultSet
的指针指向第一行之前的光标,一种更简单的检查方法是调用isBeforeFirst()
。如果要读取数据,这避免了必须回溯。
如文档中所述,如果光标不在第一条记录之前,或者ResultSet中没有行,则返回false 。
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
最好将ResultSet.next()与do {...} while()语法结合使用。
调用ResultSet.next()的“检查是否有任何结果”会将光标移动到第一行,因此,在继续处理循环返回的其余行时,请使用do {...} while()语法处理该行。
这样,您可以检查任何结果,同时也可以处理返回的所有结果。
if(resultSet.next()) { // Checks for any results and moves cursor to first row,
do { // Use 'do...while' to process the first row, while continuing to process remaining rows
} while (resultSet.next());
}
根据最可行的答案,建议是使用“ isBeforeFirst()”。如果您没有“仅转发类型”,那不是最佳解决方案。
有一种称为“ .first() ”的方法。获得完全相同的结果就不会太矫kill过正。您检查“结果集”中是否有内容,并且不要使光标前进。
该文档指出:“(...)如果结果集中没有行,则为false ”。
if(rs.first()){
//do stuff
}
您也可以只调用isBeforeFirst()来测试是否有返回的行而不前进光标,然后正常进行。– SnakeDoc 2014年9月2日19:00
但是,“ isBeforeFirst()”和“ first()”之间是有区别的。如果对“仅转发”类型的结果集进行处理,则首先会生成异常。
比较两个抛出部分:http : //docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst()http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first()
好的,基本上,这意味着只要您具有“仅转发”类型,就应该使用“ isBeforeFirst”。否则,使用“ first()”不会造成太大的伤害。
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
因为如果ResultSet没有原始值,则resultSet.first
返回false。
最好的做法是检查第一行,以便在打算获取数据时可以避免跳过行的错误。类似于:if(!resultSet.first()){System.out.println(“ no data”); }
通过使用resultSet.next(),无论resultSet是否包含任何值,您都可以轻松获取结果
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
我一直试图将当前行设置为第一个索引(使用主键)。我会建议
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
填充ResultSet时,它指向第一行之前。将其设置为第一行(由表示rs.absolute(1)
)时,它将返回true,表示已成功将其放置在第1行;如果该行不存在,则返回false。我们可以推断为
for(int i=1; rs.absolute(i); i++){
//Code
}
这会将当前行设置为位置i,如果该行不存在,则失败。这只是替代方法
while(rs.next()){
//Code
}
我创建了以下方法来检查ResultSet是否为空。
public static boolean resultSetIsEmpty(ResultSet rs){
try {
// We point the last row
rs.last();
int rsRows=rs.getRow(); // get last row number
if (rsRows == 0) {
return true;
}
// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();
return false;
}catch(SQLException ex){
return true;
}
}
有以下注意事项非常重要:
必须将CallableStatement对象设置为让ResultSet对象移到最后并回到顶部。
TYPE_SCROLL_SENSITIVE:ResultSet对象可以在末尾移动并返回顶部。进一步可以捕捉到最后的变化。
CONCUR_READ_ONLY:我们可以读取ResultSet对象的数据,但是不能更新。
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
为什么不使用rs.getRow()?
int getRow()
throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2
对我来说,检查“ if(rs.getRow()!= 0)”似乎很好。
你可以做这样的事情
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
ResultSet rs = rs.executeQuery();
if(rs.next())
{
rs = rs.executeQuery();
while(rs.next())
{
//do code part
}
}
else
{
//else if no result set
}
最好重新执行查询,因为当我们调用if(rs.next()){....}
ResultSet的第一行时,将在其中执行之后,while(rs.next()){....}
从下一行获取结果。因此,我认为重新执行内部查询if
是更好的选择。
最初,结果集对象(rs)指向BFR(在第一条记录之前)。一旦我们使用rs.next(),光标将指向第一条记录,而rs则保持“ true”。使用while循环,您可以打印表的所有记录。检索所有记录后,光标将移至ALR(最后一条记录之后),并将其设置为null。让我们考虑表中有2条记录。
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
简而言之,我们也可以将条件写为while(rs.next())。