我正在使用JDBC来实现非常简单的数据库连接。
我已经创建了连接/语句并执行了查询。我在调试器中检查语句的查询对象,以确认它正在发送正确的查询。然后,我再次检查了数据库中的查询(直接从调试器复制),以确保其返回数据。但是,返回的结果集在.next()上给出false
这里有我遗漏的常见陷阱吗?
public List<InterestGroup> getGroups() { myDB.sendQuery("select distinct group_name From group_members where username='" + this.username + "'"); ResultSet results = myDB.getResults(); List<InterestGroup> returnList = new ArrayList<InterestGroup>(); try { while (results.next()) { returnList.add(new InterestGroup(results.getString("group_name"), myDB)); } return returnList; } catch (SQLException e) { e.printStackTrace(); return null; } }
还有myDB类(一个简单的包装程序,使我可以将连接/语句代码放入任何项目中)
public void sendQuery(String query){ this.query = query; try { if(statement == null){ statement = connection.createStatement(); } results = statement.executeQuery(query); } catch (SQLException e) { System.out.println(query); currentError = e; results = null; printError(e, "querying"); } } public ResultSet getResults(){ return results; }
编辑:根据建议,我主要修改了我的代码,但仍然有相同的问题。下面是具有相同问题的代码的简化部分。
private boolean attemptLogin(String uName, String pWord) { ResultSet results; try{ try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } connection =DriverManager.getConnection(connectionString,user,password); PreparedStatement statement = connection.prepareStatement("select username from users where username='testuser'"); results = statement.executeQuery(); if(results != null && results.next()){ System.out.println("found a result"); statement.close(); return true; } System.out.println("did not find a result"); statement.close(); return false; }catch(SQLException e){ e.printStackTrace(); return false; } }
我现在还对查询进行了硬编码,以消除该错误源。与以前相同的问题(所有查询都会发生这种情况)。调试器显示所有实例化的对象,并且不打印堆栈跟踪。此外,我能够在不同的项目中使用相同的代码(以及前面列出的更复杂的代码)。
我知道了…。愚蠢的Oracle不喜欢我拥有的并发连接数(它们全部两个,一个用于控制台,一个用于Java)。不幸的是,服务器不受我的控制,所以我只需要处理它。您会认为Oracle将提供更好的响应。相反,它只是返回空结果集。
感谢您的回复
编辑 自从问到/回答以来,已经有很多人指出,根本原因很可能与使用中的提交/事务设置有关。请确保查看其他答案以获取其他提示和可能的解决方案。