我使用了一个返回固定行数的ResultSet
。我的代码大概是这样的:
ResultSet res = getData();
if(!res.next())
{
System.out.println("No Data Found");
}
while(res.next())
{
// code to display the data in the table.
}
有没有方法可以检查ResultSet
返回的行数?还是我必须自己写?
我使用了一个返回固定行数的ResultSet
。我的代码大概是这样的:
ResultSet res = getData();
if(!res.next())
{
System.out.println("No Data Found");
}
while(res.next())
{
// code to display the data in the table.
}
有没有方法可以检查ResultSet
返回的行数?还是我必须自己写?
首先,您应该创建可以通过命令移动光标的Statement
。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
接下来按照以下方式检索ResultSet
:
ResultSet rs = stmt.executeQuery(...);
将光标移动到最新的行并获取该行:
if (rs.last()) {
int rows = rs.getRow();
// Move to beginning
rs.beforeFirst();
...
}
那么rows变量将包含SQL返回的行数。
你可以使用do ... while
循环代替while
循环,这样rs.next()
将在循环执行后调用,代码如下:
if (!rs.next()) { //if rs.next() returns false
//then there are no rows.
System.out.println("No records found");
}
else {
do {
// Get data from the current row and use it
} while (rs.next());
}
或者在获取行时自己计算行数:
int count = 0;
while (rs.next()) {
++count;
// Get data from the current row and use it
}
if (count == 0) {
System.out.println("No records found");
}
一个简单的getRowCount
方法可以如下所示:
private int getRowCount(ResultSet resultSet) {
if (resultSet == null) {
return 0;
}
try {
resultSet.last();
return resultSet.getRow();
} catch (SQLException exp) {
exp.printStackTrace();
} finally {
try {
resultSet.beforeFirst();
} catch (SQLException exp) {
exp.printStackTrace();
}
}
return 0;
}
请注意,此方法需要一个可滚动的resultSet
,因此在创建连接时你必须指定滚动选项。默认值为FORWARD,如果使用此方法将会抛出异常。
ResultSet中区分0行和有数据的另一种方法:
ResultSet res = getData();
if(!res.isBeforeFirst()){ //res.isBeforeFirst() is true if the cursor
//is before the first row. If res contains
//no rows, rs.isBeforeFirst() is false.
System.out.println("0 rows");
}
else{
while(res.next()){
// code to display the rows in the table.
}
}
如果您需要在ResultSet中知道行数,这里有一个获取方法:
public int getRows(ResultSet res){
int totalRows = 0;
try {
res.last();
totalRows = res.getRow();
res.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return totalRows ;
}
res.next()
方法会将指针移动到下一行。在你的代码中,你使用了两次该方法,首先用于 if 条件(光标移动到第一行),然后用于 while 条件(光标移动到第二行)。
所以当你访问结果时,它从第二行开始。因此在结果中显示少一行。
你可以尝试这样做:
if(!res.next()){
System.out.println("No Data Found");
}
else{
do{
//your code
}
while(res.next());
}
rs.last();
int rows = rs.getRow();
rs.beforeFirst();
您可以使用SQL进行计数并从结果集中检索答案,方法如下:
Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
td.setTotalNumRows(ct.getInt(1));
}
在这里我正在计算除了你以外的所有内容,但是您可以轻松修改SQL语句,根据条件进行计数。
SELECT Count(*) FROM tranbook
,那么请执行以下操作:rs.next(); System.out.println(rs.getInt("Count(*)"));
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());
第一行代码表示我们可以在结果集中任意移动(无需从第一行开始逐行遍历),包括移到第一行、最后一行或第一行之前。这样做可以节省时间。第二行代码获取与查询匹配的记录,我在这里假设有25条记录。第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在我的情况下是25。如果没有记录,则rs.last返回0,并且getrow将光标移动到第一行之前,因此返回负值表示数据库中没有记录。