Java 结果集异常-开始前 公共静态用户getUser(用户用户)引发异常{ String sql=“SELECT*FROM login WHERE userID=”+user.getuserID()+”; //这是正确的吗? PreparedStatement pStatement=conn.prepareStatement(sql); ResultSet-Rset=pStatement.executeQuery(sql); Rset.beforeFirst(); Rset.next(); intuserid=Rset.getInt(“userID”); String email=Rset.getString(“电子邮件”); 用户userReturn=新用户(用户ID、电子邮件); return用户返回; }
通过Java 结果集异常-开始前 公共静态用户getUser(用户用户)引发异常{ String sql=“SELECT*FROM login WHERE userID=”+user.getuserID()+”; //这是正确的吗? PreparedStatement pStatement=conn.prepareStatement(sql); ResultSet-Rset=pStatement.executeQuery(sql); Rset.beforeFirst(); Rset.next(); intuserid=Rset.getInt(“userID”); String email=Rset.getString(“电子邮件”); 用户userReturn=新用户(用户ID、电子邮件); return用户返回; },java,jdbc,singlestore,Java,Jdbc,Singlestore,通过pStatement.executeQuery()更改pStatement.executeQuery(sql) 而且userID是int,因此不需要在查询中使用单引号,(但这不是异常的根) 我建议在Rset.next()上使用if语句(该语句增加游标,无需使用beforeFirst()),如果查询不返回任何内容,则在获取值时可能会导致异常 使用如下代码 public static User getUser (User user) throws Exception { Stri
pStatement.executeQuery()更改pStatement.executeQuery(sql)
而且userID
是int
,因此不需要在查询中使用单引号,
(但这不是异常的根)
我建议在Rset.next()
上使用if
语句(该语句增加游标,无需使用beforeFirst()
),如果查询不返回任何内容,则在获取值时可能会导致异常
使用如下代码
public static User getUser (User user) throws Exception {
String sql = "SELECT * FROM login WHERE userID = " + user.getuserID();
//is FROM Correct?
PreparedStatement pStatement = conn.prepareStatement(sql);
ResultSet Rset = pStatement.executeQuery();
if(Rset.next())
{
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
}
return null;
}
通过pStatement.executeQuery()更改pStatement.executeQuery(sql)
而且userID
是int
,因此不需要在查询中使用单引号,
(但这不是异常的根)
我建议在Rset.next()
上使用if
语句(该语句增加游标,无需使用beforeFirst()
),如果查询不返回任何内容,则在获取值时可能会导致异常
使用如下代码
public static User getUser (User user) throws Exception {
String sql = "SELECT * FROM login WHERE userID = " + user.getuserID();
//is FROM Correct?
PreparedStatement pStatement = conn.prepareStatement(sql);
ResultSet Rset = pStatement.executeQuery();
if(Rset.next())
{
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
}
return null;
}
嗯,您的JDBC/SQL可能需要一些更新
但首先要做的是。情况就是这样:
ResultSet Rset = pStatement.executeQuery(sql); //Executes the query
Rset.beforeFirst(); //Moves the cursor backwards before the first row (!)
Rset.next(); //Goes to the next row
第二行抛出一个Exeption,因为光标仅向前。另外:你根本不需要那个电话
这应该可以解决您眼前的问题:
ResultSet Rset = pStatement.executeQuery(sql);
if(Rset.next()) {
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
} else {
//Deal with no user found
}
现在谈谈一般性的问题:
- 很高兴你正在准备这份声明。但正如巴希尔已经指出的:如果您使用executeQuery(sql),它是类语句的一个成员,那么您就丢弃了预编译语句
- 使用PreparedStatement时,也要使用绑定参数。这使得您的代码不太适合SQL注入和
- 使用“试用资源”确保正确关闭所有内容。查找连接泄漏或打开的游标很容易避免
最后你可能会得到这样的结果:
public static User getUser (User user) throws Exception {
String sql = "SELECT * FROM login WHERE userID = ?;
try(PreparedStatement pStatement = conn.prepareStatement(sql)) {
pStatement.setInt(1, user.getuserID());
try(ResultSet Rset = pStatement.executeQuery()) {
if(Rset.next()) {
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
}
}
} catch(SQLException e) {
//Deal with the exception
e.printStackTrace();
}
//Error or no user found
return null;
}
嗯,您的JDBC/SQL可能需要一些更新
但首先要做的是。情况就是这样:
ResultSet Rset = pStatement.executeQuery(sql); //Executes the query
Rset.beforeFirst(); //Moves the cursor backwards before the first row (!)
Rset.next(); //Goes to the next row
第二行抛出一个Exeption,因为光标仅向前。另外:你根本不需要那个电话
这应该可以解决您眼前的问题:
ResultSet Rset = pStatement.executeQuery(sql);
if(Rset.next()) {
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
} else {
//Deal with no user found
}
现在谈谈一般性的问题:
- 很高兴你正在准备这份声明。但正如巴希尔已经指出的:如果您使用executeQuery(sql),它是类语句的一个成员,那么您就丢弃了预编译语句
- 使用PreparedStatement时,也要使用绑定参数。这使得您的代码不太适合SQL注入和
- 使用“试用资源”确保正确关闭所有内容。查找连接泄漏或打开的游标很容易避免
最后你可能会得到这样的结果:
public static User getUser (User user) throws Exception {
String sql = "SELECT * FROM login WHERE userID = ?;
try(PreparedStatement pStatement = conn.prepareStatement(sql)) {
pStatement.setInt(1, user.getuserID());
try(ResultSet Rset = pStatement.executeQuery()) {
if(Rset.next()) {
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
}
}
} catch(SQLException e) {
//Deal with the exception
e.printStackTrace();
}
//Error or no user found
return null;
}
创建标准的ResultSet
时,只能使用rs.next()
方法迭代生成的行。因此不允许使用rs.beforeFirst()
。
在代码中也不需要它。创建ResultSet
时,光标将自动放置在第一行之前。因此,只需使用if(rs.next()){…}
。当rs.next()
在第一次调用后返回false时,表示ResultSet
为空。创建标准ResultSet
时,只能使用rs.next()
方法迭代结果行。因此不允许使用rs.beforeFirst()
。
在代码中也不需要它。创建ResultSet
时,光标将自动放置在第一行之前。因此,只需使用if(rs.next()){…}
。当rs.next()
在第一次调用后返回false时,这意味着ResultSet
是空的。我不确定是否有问题,除了隐含的“为什么我会出现此错误”。为什么您甚至调用beforeFirst()
?这样做在你的代码中毫无意义。我不确定是否有问题,除了隐含的“为什么我会出现这个错误”。你为什么还要在beforeFirst()之前调用?在代码中这样做毫无意义。