我在Oracle查询后得到ResultSet
。当我遍历ResultSet
时,它进入了无限循环。
ResultSet rs = (ResultSet) // getting from statement
while (rs.next()) {
//
//
}
这个循环没有终止,所以我尝试使用rs.getFetchSize()
找到记录的数量,并返回一个值10。我想知道这是否是找出ResultSet中记录数量的正确方法,如果计数为10,为什么它会进入无限循环。
实际上,ResultSet并不知道它将返回的实际行数。事实上,使用层次查询或流水线函数,这个数字可能是无限的。10是结果集应该/将尝试在单个操作中获取的建议行数。(见下面的评论)。
如果查询返回的行数比预期的多,最好检查一下。
要知道当前记录的数量,请尝试以下代码
ResultSet rs = // getting from statement
try {
boolean b = rs.last();
int numberOfRecords = 0;
if(b){
numberOfRecords = rs.getRow();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
一个简单的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应该是可滚动的使用这个方法。
看一下,这似乎是关于这个问题的相似之处
当您执行查询并获得ResultSet时,我想说的是,此时您甚至程序本身实际上并不会返回多少结果,这种情况非常类似于Oracle CURSOR,它只是向Oracle声明您想要做这样的查询,因此我们必须为每个ResultSet逐个获取行,直到最后一个。
正如上面的家伙已经回答过的那样:rs.last将迭代到最后一个,此时程序有能力完全返回多少行。
if(res.getRow()>0)
{
// Data present in resultset<br>
}
else
{
//Data not present in resultset<br>
}
您可以查看下面的代码片段,其中您可以找到如何从数据集中计算加载的记录数。本例使用外部数据集(json格式),因此您可以从自己的数据集开始。必要的代码片段放在控制器的脚本中(该页基于ApPML javascript,控制器与加载的ApPML对象一起工作)。控制器中的代码返回数据集的加载记录数和数据模型的字段数。
<!DOCTYPE html>
<html lang="en-US">
<title>Customers</title>
<style>
body {font: 14px Verdana, sans-serif;}
h1 { color: #996600; }
table { width: 100%;border-collapse: collapse; }
th, td { border: 1px solid grey;padding: 5px;text-align: left; }
table tr:nth-child(odd) {background-color: #f1f1f1;}
</style>
<script src="http://www.w3schools.com/appml/2.0.2/appml.js"></script>
<body>
<div appml-data="http://www.w3schools.com/appml/customers.aspx" appml-controller="LukController">
<h1>Customers</h1>
<p></p>
<b>It was loaded {{totalRec}} records in total.</b>
<p></p>
<table>
<tr>
<th>Customer</th>
<th>City</th>
<th>Country</th>
</tr>
<tr appml-repeat="records">
<td>{{CustomerName}}</td>
<td>{{City}}</td>
<td>{{Country}}</td>
</tr>
</table>
</div>
<script>
function LukController($appml) {
if ($appml.message == "loaded") {
$appml.totalRec = Object.keys($appml.data.records).length;
}
}
// *****************************************************************
// Message Description
//
// ready Sent after AppML is initiated, and ready to load data.
// loaded Sent after AppML is fully loaded, ready to display data.
// display Sent before AppML displays a data item.
// done Sent after AppML is done (finished displaying).
// submit Sent before AppML submits data.
// error Sent after AppML has encountered an error.
// *****************************************************************
</script>
</body>
</html>
我得到了答案:-以下是你需要遵循的步骤:
- 确保您正在使用select query(e)。select * from employee).
- 不要使用计数查询(e。select count(*) from employee .
然后使用以下步骤:
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from employee");
while(rs.next()){
rowCount++;
}
return rowCount;
}
其中rs
为ResultSet
的对象。