java - ResultSet 异常 - 开始之前
问题描述
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(sql);
Rset.beforeFirst();
Rset.next();
int userID = Rset.getInt("userID");
String email = Rset.getString("email");
User userReturn = new User (userID, email);
return userReturn;
}
Trace: java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.result.ResultSetImpl.beforeFirst(ResultSetImpl.java:426)
at DaoLayer.daoImplementation.getUser(daoImplementation.java:28)
at DaoLayer.DaoTest.testGetUser(DaoTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
解决方案
创建标准时ResultSet
,您只能使用rs.next()
方法来迭代结果行。所以rs.beforeFirst()
是不允许的。而且在您的代码中也没有必要。创建ResultSet
时,光标会自动放置在第一行之前。所以,只使用if(rs.next()) {...}
. 当rs.next()
第一次调用后返回 false 时,表示ResultSet
为空。
推荐阅读
- excel - 在 VBA 中编码时出现 Å、Ä 和 Ö(对于其他用户)的问题
- json - Spring Boot http消息转换器有时会序列化null
- elixir - 在论坛外保留查询参数
- c++ - 使用 Eigen 和 OpenMP 的线程安全并行稀疏-稀疏矩阵乘法
- c - 复数 (complex.h) 和明显的精度滞后
- mongodb - 一个业务问题需要 mongodb 帮助
- javascript - TO DO APP - 如何将 2 个图标对齐到 li 的右侧?
- casting - Concrete5 Community Store (Square) 不以整数形式处理付款
- azure - 创建索引器以播种 Azure 搜索索引时出现“操作已取消”错误
- node.js - 如何让 node express 根据相同 url 的输入给出响应