我正在使用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;
}
}
我目前已经硬编码了查询,以消除错误的来源。和之前一样的问题(这种情况发生在所有查询中)。调试器显示所有对象都被实例化,没有打印堆栈跟踪信息。此外,我能够在另一个项目中使用相同的代码(包括之前列出的更复杂的代码)。
connectionString
、user
和password
都是正确的吗? - darioo