JDBC返回空结果集

dps*_*ree 16 java sql oracle jdbc resultset

我正在使用JDBC进行非常简单的数据库连接.

我创建了我的连接/语句并执行了查询.我在调试器中检查语句的查询对象以确认它正在发送正确的查询.然后我仔细检查数据库上的查询(直接从调试器复制)以确保它返回数据.但是,返回的结果集在.next()上给出了错误

这里有任何常见的陷阱,我错过了吗?

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

和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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据建议,我大多修改了我的代码,但仍然有同样的问题.下面是具有相同问题的代码的简化部分.

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

dps*_*ree 21

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

谢谢你的回复

编辑因为有人问过/回答过,有很多人指出潜在原因更可能与使用中的提交/事务设置有关.请务必查看其他答案以获取更多提示和可能的解决方案.


dar*_*ioo 9

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

首先,使用常规语句.使用预准备语句,这样您就不会遇到SQL注入问题.

代替

statement = connection.createStatement();
Run Code Online (Sandbox Code Playgroud)

使用

statement = connection.prepareStatement(String sql);
Run Code Online (Sandbox Code Playgroud)

有了这个,你的查询就变成了

"select distinct group_name From group_members where username= ?"
Run Code Online (Sandbox Code Playgroud)

并设置用户名

 statement.setString(1, username);
Run Code Online (Sandbox Code Playgroud)

接下来,我不喜欢使用你的myDB课程.如果结果null怎么办?您没有在public List<InterestGroup> getGroups()方法中对此进行任何错误检查.

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

另外,这一行:

new InterestGroup(results.getString("group_name"), myDB)
Run Code Online (Sandbox Code Playgroud)

为什么你有myDB参数?

我建议System.out.println在代码中添加更多语句,以便查看出错的地方.


小智 9

我也遇到了同样的情况。我使用SQL Developer将测试数据插入我的数据库并使用 JDBC 测试读取。但我得到的只是一个空的结果集。我可以获得列名和所有内容,但在读取数据时遇到问题。正如 dpsthree 之前指出的那样,我断开了 SQL Developer IDE 的连接,然后它要求我在退出时提交。

瞧!问题是使用插入命令对数据库的更改没有提交。

对于 SQL Developer,它位于首选项 > 数据库 > 高级 > 自动提交

这解决了我的问题。


小智 5

在java.sql.connection中,您应该在创建连接后调用此方法:

conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
Run Code Online (Sandbox Code Playgroud)

也许在Oracle中有类似的方法.