我正在使用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将提供更好的响应。相反,它只是返回空结果集。
感谢您的回复
编辑 自从问到/回答以来,已经有很多人指出,根本原因很可能与使用中的提交/事务设置有关。请确保查看其他答案以获取其他提示和可能的解决方案。
方法返回空结果。我正在尝试使用Spring-boot、h2数据库和JPA来实现rest服务。 下面是我的 我的文件包括: 实体: 接口:
问题内容: 我正在调用一个Sybase存储过程,该存储过程通过JDBC返回多个结果集。我需要获取一个具有名为“ Result”的列的特定结果集,这是我的代码: 这里发生的是返回很多空结果集,直到达到目标结果集为止。我不能用作循环条件,因为它对空结果集返回false。 我放置了一个固定数字以结束循环,条件是没有返回所需的结果集,以防止其进入无限循环。它工作正常,但我认为这是不对的。 我认为从Syba
为了最大限度地利用java8流和Spring4,我在来自Springs jsdbRestTem板的JDBC结果集上使用了流API,如下所示(代码缩短并简化): 这似乎很有效。客户端可以像这样使用流Api,而不用担心jdbc类 但是,当我重构(尝试将流提供给客户端方法)时,像这样: 我明白了 因此,数据似乎只能在方法。是否有一种干净的方法可以绕过这个问题,返回来自DB的元素的惰性流?假设具体化结果和
空结果如下所示: 非空结果(所需结果)如下所示: 我有这个函数,它应该获取“. flac”文件并将其转换为文本。出于某种原因,只有这两个示例“. flac”文件在通过Google Speech API时返回字符串,其他flac文件返回EMPTY结果。这些人遇到的同样问题:链接 这是我所有的flac文件:链接 <代码>我的。flac和此\u is\u a\u测试。flac工作得很好,google语音
问题内容: 我正在尝试创建一种方法,从中可以查询数据库并检索整个表。 目前,如果我使用这些数据只是正常工作 中 的方法。但是,我希望该方法返回结果。 我正在了解当前代码。 我该如何实现? 问题答案: 您永远不要通过公共方法来回避。这很容易导致资源泄漏,因为您不得不保持语句和连接打开。关闭它们将隐式关闭结果集。但是,将它们保持打开状态将导致它们悬而未决,并且当它们打开过多时,将导致数据库用尽资源。
我正在使用JOOQ和Postgres。在博士后中,我有一个专栏性别: (表本身是一个视图,性别列是用Java计算的值的占位符) 在Java中,当I.fetch()视图时,我会对每条记录进行一些计算: 所有看起来都很好,如果打印值,它们都是正确的。但是,当我在我的技能记录上调用intoResultSet()时,性别列在所有值旁边都有一个星号,例如“*男性”。 然后,我使用结果集作为OpenCSV C