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会提供更好的响应.相反,它只返回空结果集.
谢谢你的回复
编辑因为有人问过/回答过,有很多人指出潜在原因更可能与使用中的提交/事务设置有关.请务必查看其他答案以获取更多提示和可能的解决方案.
我在你的代码中看到了一些陷阱,有些地方可能会出错:
首先,使用常规语句.使用预准备语句,这样您就不会遇到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中有类似的方法.