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()之前调用
?在代码中这样做毫无意义。