gpt4 book ai didi

查询用户数据时,Java ResultSet 已关闭异常

转载 作者:行者123 更新时间:2023-12-02 08:24:02 25 4
gpt4 key购买 nike

正如我在标题中开始的那样,当我在 java 应用程序中查询用户数据时,我收到以下消息:“ResultSet 关闭后不允许操作”

我知道如果您尝试同时打开更多结果集,就会发生这种情况。

这是我当前的代码:

应用程序调用 getProject("..."),其他 2 个方法只是为了提供帮助。我使用了 2 个类,因为代码较多,这只是我得到的异常的一个示例。

请注意,为了更好地理解,我已经翻译了变量名称等,我希望我没有遗漏任何内容。

/* Class which reads project data */

public Project getProject(String name) {
ResultSet result = null;
try {
// executing query for project data
// SELECT * FROM Project WHERE name=name
result = statement.executeQuery(generateSelect(tProject.tableName,
"*", tProject.name, name));
// if cursor can't move to first place,
// that means that project was not found
if (!result.first())
return null;
return user.usersInProject(new Project(result.getInt(1), result
.getString(2)));
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (BadAttributeValueExpException e) {
e.printStackTrace();
return null;
} finally {
// closing the ResultSet
try {
if (result != null)
result.close();
} catch (SQLException e) {
}
}
}

/* End of class */

/* Class which reads user data */

public Project usersInProject(Project p) {
ResultSet result = null;
try {
// executing query for users in project
// SELECT ID_User FROM Project_User WHERE ID_Project=p.getID()
result = statement.executeQuery(generateSelect(
tProject_User.tableName, tProject_User.id_user,
tProject_User.id_project, String.valueOf(p.getID())));

ArrayList<User> alUsers = new ArrayList<User>();
// looping through all results and adding them to array
while (result.next()) { // here java gets ResultSet closed exception
int id = result.getInt(1);
if (id > 0)
alUsers.add(getUser(id));
}
// if no user data was read, project from parameter is returned
// without any new user data
if (alUsers.size() == 0)
return p;
// array of users is added to the object,
// then whole object is returned
p.addUsers(alUsers.toArray(new User[alUsers.size()]));
return p;
} catch (SQLException e) {
e.printStackTrace();
return p;
} finally {
// closing the ResultSet
try {
if (result != null)
result.close();
} catch (SQLException e) {
}
}
}

public User getUser(int id) {
ResultSet result = null;
try {
// executing query for user:
// SELECT * FROM User WHERE ID=id
result = statement.executeQuery(generateSelect(tUser.tableName,
"*", tUser.id, String.valueOf(id)));
if (!result.first())
return null;
// new user is constructed (ID, username, email, password)
User usr = new user(result.getInt(1), result.getString(2),
result.getString(3), result.getString(4));
return usr;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (BadAttributeValueExpException e) {
e.printStackTrace();
return null;
} finally {
// closing the ResultSet
try {
if (result != null)
result.close();
} catch (SQLException e) {
}
}
}

/* End of class */

两个类的语句都添加到构造函数中,在构造每个类时调用 connection.getStatement()。

tProject 和 tProject_User 是我的枚举,我使用它来更轻松地处理名称。 generateSelect 是我的方法,应该按预期工作。我使用它是因为在编写了大部分代码后我发现了准备好的语句,所以我保持原样。

我正在使用最新的 java MySQL 连接器 (5.1.21)。

我不知道还能尝试什么。任何建议将不胜感激。

最佳答案

引用@aroth的回答:

在很多情况下,ResultSet将会自动为您关闭。引用官方文档: http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html

A ResultSet object is automatically closed when the Statement object that generated 
it is closed, re-executed, or used to retrieve the next result from a sequence of
multiple results.

在您的代码中,您正在创建新的 ResultSet在方法getUser中使用相同的StatementusersInProject 中创建结果集的对象方法,该方法会导致在方法 usersInProject 中关闭结果集对象.

解决方案:创建另一个语句对象并在 getUser 中使用它创建结果集。

关于查询用户数据时,Java ResultSet 已关闭异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com