我使用了返回特定行数的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
返回的行数?或者我必须自己写吗?
答案 0 :(得分:67)
首先,您应该创建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
返回的行数答案 1 :(得分:53)
您可以使用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");
}
答案 2 :(得分:26)
一个简单的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,使用此方法会引发异常。
答案 3 :(得分:7)
从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 ;
}
答案 4 :(得分:6)
res.next()
方法将指针指向下一行。在你的代码中你使用它两次,首先是if条件(光标移动到第一行)然后是while条件(光标移动到第二行)。
因此,当您访问结果时,它从第二行开始。因此,结果显示少一行。
你可以试试这个:
if(!res.next()){
System.out.println("No Data Found");
}
else{
do{
//your code
}
while(res.next());
}
答案 5 :(得分:4)
您可以使用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。
答案 6 :(得分:3)
rs.last();
int rows = rs.getRow();
rs.beforeFirst();
答案 7 :(得分:0)
您可以将ResultSet加载到TableModel中,然后创建使用该TableModel的JTable,然后使用table.getRowCount()方法。如果要显示查询结果,则无论如何都必须这样做。
ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;
答案 8 :(得分:0)
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将游标移动到第一行之前,因此返回负值表示db中没有记录
答案 9 :(得分:0)
这是我的解决方案
ResultSet rs=Statement.executeQuery("query");
int rowCount=0;
if (!rs.isBeforeFirst())
{
System.out.println("No DATA" );
} else {
while (rs.next()) {
rowCount++;
System.out.println("data1,data2,data3...etc..");
}
System.out.println(rowCount);
rowCount=0;
rs.close();
Statement.close();
}
答案 10 :(得分:0)
如果您的查询类似SELECT Count(*) FROM tranbook
,请执行rs.next(); System.out.println(rs.getInt("Count(*)"));
答案 11 :(得分:0)
对于我来说,我需要从ResultSet中获取总行,并且如果总行未达到XLS文件的限制,还需要访问ResultSet值。
为此,我必须对代码进行两项调整:
1)更改对象构造PreparedStatement
默认ResultSet对象的光标仅向前移动。因此,您只能从第一行到最后一行迭代一次。可以产生可滚动的ResultSet对象。下面的代码片段说明了如何制作可滚动且对其他人的更新不敏感的结果集。
PreparedStatement ps = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
2)获取总行数。以下代码片段说明了如何:
ResultSet rs = ps.executeQuery();
rs.last();
int totalRowsResult = rs.getRow();
PS:如果查询结果的记录数太大,则可能会由于异常而导致Java服务器上的内存不足:java.lang.OutOfMemoryError:Java堆空间。执行rs.last()方法时将发生此异常
3)再次访问ResultSet,您没有收到以下消息:精疲力尽的结果集。因此,您需要使用rs.first()或rs.absolute(1)将结果集重置为顶部。以下代码片段说明了如何:
rs.first();
System.out.println(rs.getString(1));
答案 12 :(得分:-1)
您可以按如下方式使用res.previous()
:
ResulerSet res = getDate();
if(!res.next()) {
System.out.println("No Data Found.");
} else {
res.previous();
while(res.next()) {
//code to display the data in the table.
}
}
答案 13 :(得分:-1)
您可能会认为JDBC是一个丰富的API,并且ResultSet有很多方法,那么为什么不只是getCount()方法?好吧,对于许多数据库,例如Oracle,MySQL和SQL Server的ResultSet是一种流API,这意味着它不会从数据库服务器中加载(甚至提取)所有行。通过迭代到ResultSet的末尾,可以在某些情况下显着增加执行时间。
顺便说一句,如果必须的话,有两种方法可以做到这一点,例如通过使用ResultSet.last()和ResultSet.getRow()方法,这不是最好的方法,但是如果您绝对需要它,它就可以工作。
但是,在Java中,从ResultSet获取列数很容易。 JDBC API提供了一个ResultSetMetaData类,该类包含一些方法来返回查询返回的列数并由ResultSet保留。