JDBC 返回空结果集

2022-09-02 05:15:20

我正在使用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;
    }

}

我现在还对查询进行了硬编码,以消除该错误源。与以前相同的问题(所有查询都会发生这种情况)。调试器显示实例化的所有对象,并且不打印堆栈跟踪。此外,我能够在不同的项目中使用相同的代码(以及前面列出的更复杂的代码)。


答案 1

我想通了...愚蠢的Oracle不喜欢我拥有的并发连接数(所有两个,一个用于控制台,一个用于java)。不幸的是,服务器不在我的控制之下,所以我只需要处理它。您可能会认为Oracle会提供更好的响应。相反,它只是返回空的结果集。

感谢您的回复

编辑自从提出/回答这个问题以来,已经有很多人指出,根本原因更可能与正在使用的提交/事务设置有关。请务必查看其他答案以获取其他提示和可能的解决方案。


答案 2

我在你的代码中看到了一些陷阱,有几个地方可能会出错:

首先,使用常规语句。使用预准备语句,这样 SQL 注入就不会出现问题。

而不是

statement = connection.createStatement();

statement = connection.prepareStatement(String sql);

这样,您的查询就变成了

"select distinct group_name From group_members where username= ?"

并且您将用户名设置为

 statement.setString(1, username);

接下来,我不喜欢使用你的类。如果结果是 ?您没有在方法中对此进行任何错误检查。myDBnullpublic List<InterestGroup> getGroups()

public void sendQuery(String query)在我看来,它不应该是,但它应该返回一个.此外,在网络上搜索执行 JDBC 异常处理的正确方法。voidResultSet

此外,此行:

new InterestGroup(results.getString("group_name"), myDB)

为什么有参数?myDB

我建议在代码中添加更多语句,以便您可以看到哪里可能出错。System.out.println


推荐