关于java.sql.SQLException: 未调用 ResultSet.next的有关问题
求助关于java.sql.SQLException: 未调用 ResultSet.next的问题!
今天在练习注册登录功能的时候,发现了如下的问题:
每当我调用rs.setInt()的时候都提示java.sql.SQLException: 未调用 ResultSet.next,但是我明明调用了啊,代码如下。
PS:我用的是ORACLE11G+TOMCAT6+MYECLIPSE,连接数据库是写了个JdbcTools的JAVA文件来调用。
首先是JDBCTOOLS:
package tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
/**
* @author jdbc连接数据库的操作类
*
*/
public class JdbcTools {
/*连接对象*/
private static Connection conn = null;
/*语句对象*/
private static Statement st = null;
/*结果集对象*/
private static ResultSet rs = null;
/**
* @author jdbc数据库的方法
*
*/
public JdbcTools(){
String url = "jdbc:oracle:thin:@localhost:1521:orcl";//连接的数据库
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, "sys as sysdba", "Oracle11g");//设置用户名,密码
st = conn.createStatement();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @author 添加,修改,删除数据库中记录的方法
*
*/
public int update(String sql){
try{
return st.executeUpdate(sql);
}catch(SQLException e){
e.printStackTrace();
System.out.println("您所执行的语句有问题");
return 0;
}
}
/**
* @author 查询数据库中记录的方法
*
*/
public ResultSet search(String sql){
try{
rs = st.executeQuery(sql);
return rs;
}catch(SQLException e){
e.printStackTrace();
System.out.println("您所执行的语句有问题");
return null;
}
}
//批处理 一下处理一批
public int[] updateMore(LinkedList<String> sql){
try {
for (int j = 0; j < sql.size(); j++) {
st.addBatch(sql.get(j));
}
return st.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* @author 关闭连接语句对象以及结果集对象的方法
*
*/
public void colseAll(){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
然后是登录检验这里:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="tools.JdbcTools" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登录验证</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
boolean success = false;//是否能够成功登录
boolean valid = true;//是否重复登录了
int id = 0;
request.setCharacterEncoding("GBK");//设置编码为GBK
String username = request.getParameter("username");
String password = request.getParameter("password");
String sql = "select * from vip where username='" + username + "' and password='" + password + "'";
JdbcTools l = new JdbcTools();//实例化对象
l.search(sql);
if(l.search(sql).next()){
success = true;
id = l.search(sql).getInt("usernumber");
}
else
{
success = false;
}
//根据登录结果判断
Vector UserList = (Vector)session.getAttribute("userlist");
if(UserList == null){
UserList = new Vector();
}
if(success){
session.setAttribute("username",username);
UserList.addElement(username);
//判断是否重复登录
for(int i=0;i<UserList.size()-1;i++){
if(username.equals(UserList.elementAt(i).toString())){
UserList.removeElement(username);
valid = false;
%>
<h3>用户<%=username%>已经登录,请不要重复登录!</h3>
<%
}
}
if(valid){
session.setAttribute("userlist",UserList);
session.setAttribute("username",username);
response.sendRedirect("index.jsp?id=" + String.valueOf(id));
}
}
else
{
%>
<h3>用户名或密码错误,请重新登录!</h3>
<%
}
%>
<a href="javascript:history.back();">返回</a>
</body>
</html>
在中间的这一行id = l.search(sql).getInt("usernumber");
出错,提示未调用ResultSet.next,求大神指教!
------解决思路----------------------
public interface ResultSet extends Wrapper
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
l.search(sql).getInt("usernumber"); 楼主这里l.search(sql) 只是执行了查询,拿到了结果集,但是没有调用.next 方法,所以光标没有移动到第一行结果处,无法继续调用getInt("usernumber")
------解决思路----------------------
问题出在这里,你最开始使用 l.search(sql);查出结果集,为什么不用一个ResultSet来接收呢?
你下面确实使用了nest(),但你那个是又查询了一次:l.search(sql).next(),这里确实也nest了,但是你怎么下面又重新查询一次?
id = l.search(sql).getInt("usernumber");
你这样明显就是重新查询的,所以当然报没有调用nest了,正确的做法是:
今天在练习注册登录功能的时候,发现了如下的问题:
每当我调用rs.setInt()的时候都提示java.sql.SQLException: 未调用 ResultSet.next,但是我明明调用了啊,代码如下。
PS:我用的是ORACLE11G+TOMCAT6+MYECLIPSE,连接数据库是写了个JdbcTools的JAVA文件来调用。
首先是JDBCTOOLS:
package tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
/**
* @author jdbc连接数据库的操作类
*
*/
public class JdbcTools {
/*连接对象*/
private static Connection conn = null;
/*语句对象*/
private static Statement st = null;
/*结果集对象*/
private static ResultSet rs = null;
/**
* @author jdbc数据库的方法
*
*/
public JdbcTools(){
String url = "jdbc:oracle:thin:@localhost:1521:orcl";//连接的数据库
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, "sys as sysdba", "Oracle11g");//设置用户名,密码
st = conn.createStatement();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @author 添加,修改,删除数据库中记录的方法
*
*/
public int update(String sql){
try{
return st.executeUpdate(sql);
}catch(SQLException e){
e.printStackTrace();
System.out.println("您所执行的语句有问题");
return 0;
}
}
/**
* @author 查询数据库中记录的方法
*
*/
public ResultSet search(String sql){
try{
rs = st.executeQuery(sql);
return rs;
}catch(SQLException e){
e.printStackTrace();
System.out.println("您所执行的语句有问题");
return null;
}
}
//批处理 一下处理一批
public int[] updateMore(LinkedList<String> sql){
try {
for (int j = 0; j < sql.size(); j++) {
st.addBatch(sql.get(j));
}
return st.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* @author 关闭连接语句对象以及结果集对象的方法
*
*/
public void colseAll(){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
然后是登录检验这里:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="tools.JdbcTools" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登录验证</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
boolean success = false;//是否能够成功登录
boolean valid = true;//是否重复登录了
int id = 0;
request.setCharacterEncoding("GBK");//设置编码为GBK
String username = request.getParameter("username");
String password = request.getParameter("password");
String sql = "select * from vip where username='" + username + "' and password='" + password + "'";
JdbcTools l = new JdbcTools();//实例化对象
l.search(sql);
if(l.search(sql).next()){
success = true;
id = l.search(sql).getInt("usernumber");
}
else
{
success = false;
}
//根据登录结果判断
Vector UserList = (Vector)session.getAttribute("userlist");
if(UserList == null){
UserList = new Vector();
}
if(success){
session.setAttribute("username",username);
UserList.addElement(username);
//判断是否重复登录
for(int i=0;i<UserList.size()-1;i++){
if(username.equals(UserList.elementAt(i).toString())){
UserList.removeElement(username);
valid = false;
%>
<h3>用户<%=username%>已经登录,请不要重复登录!</h3>
<%
}
}
if(valid){
session.setAttribute("userlist",UserList);
session.setAttribute("username",username);
response.sendRedirect("index.jsp?id=" + String.valueOf(id));
}
}
else
{
%>
<h3>用户名或密码错误,请重新登录!</h3>
<%
}
%>
<a href="javascript:history.back();">返回</a>
</body>
</html>
在中间的这一行id = l.search(sql).getInt("usernumber");
出错,提示未调用ResultSet.next,求大神指教!
------解决思路----------------------
public interface ResultSet extends Wrapper
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
l.search(sql).getInt("usernumber"); 楼主这里l.search(sql) 只是执行了查询,拿到了结果集,但是没有调用.next 方法,所以光标没有移动到第一行结果处,无法继续调用getInt("usernumber")
------解决思路----------------------
l.search(sql);
if(l.search(sql).next()){
success = true;
id = l.search(sql).getInt("usernumber");
}
问题出在这里,你最开始使用 l.search(sql);查出结果集,为什么不用一个ResultSet来接收呢?
你下面确实使用了nest(),但你那个是又查询了一次:l.search(sql).next(),这里确实也nest了,但是你怎么下面又重新查询一次?
id = l.search(sql).getInt("usernumber");
你这样明显就是重新查询的,所以当然报没有调用nest了,正确的做法是:
ResultSet resset = l.search(sql);
if(resset != null ) {
while(resset .nest()) {
success = true;
id = resset.getInt("usernumber");
}
}