我正在使用select查询按名称从表中选择特定记录。该表包含超过25000条记录。
表格格式为
|rcode|rname|vcode|vname|div_sec|ofrn|phone|dat|
此外,它可能包含多个具有相同名称的记录。我正在使用以下查询
ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'");
if(rs.next())
{
rcode=rs.getString("rcode");
out.print(rcode);
out.print(" ");
}
我必须找出给定rname的rcode。现在使用上述查询的问题是,如果我搜索名为“kannan”的记录,该表包含6条名为“kannan”的记录为
10001 kannan
10089 kannan
11826 kannan
12241 kannan
12389 kannan
19926 kannan
现在,我的查询只获取了第一条记录并将结果显示为 rcode =“10001”
如果我使用
while(rs.next())
{
rcode=rs.getString("rcode");
out.print(rcode);
out.print(" ");
}
它只打印最后一条记录 rcode =“19926”。假设我想用rcode 12241获取“kannan”的记录,我该如何修改查询来获取记录?请注意,我必须仅使用rname来获取详细信息。
这个问题有解决办法吗?请有人帮帮我
答案 0 :(得分:2)
实际上,第二个代码段应该输出所有的kannan
条记录,除非您错误地转录了它。 此将输出最后一个:
while(rs.next()) {
rcode=rs.getString("rcode");
}
out.print(rcode);
out.print(" ");
理想的解决方案是根据以下两列将查询更改为限制:
select * from newfarmer where rname = 'kannan' and rcode = '12241'
但是,既然你认为这是一种可能性,那么你必须全部解决这些问题并过滤掉你想要的那些(但是与让DBMS这样做相比效率低)。换句话说,比如:
while(rs.next()) {
rcode=rs.getString("rcode");
if (rcode == "12241") { // or some other identifying condition.
out.print(rcode);
out.print(" ");
}
}
我的建议是返回并重新检查您是否只需使用rname
来获取记录。这似乎是一个奇怪的限制,并使任何解决方案都不如其他方式那么优化。
答案 1 :(得分:1)
第二个剪切肯定会检索ResultSet中的所有行,但请注意,除非您在SQL中提供order by子句,否则不会保证记录的顺序。也许这就是为什么你认为它只是最后一个 - 你只看到返回的第一行,发现它是你期望的最后一个,而忽略了其余的。只是一种可能性。
rname列上是否有索引?如果没有,查询将会很慢。
另外,这个:
ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'");
是对SQL注入攻击的一个大而开放的邀请。 Insead在准备好的声明中使用参数:
//Just prepare the statement once for multiple uses:
Statement stmt = conn.prepareStatement("select * from newfarmer where rname=?");
//use it:
stmt.setString(1, name);
ResultSet rs = stmt.execute();
// etc...