Obtenir java.sql.SQLException: opération non autorisée après la fermeture de ResultSet
Lorsque j'exécute le code suivant, j'obtiens une exception. Je pense que c'est parce que je suis en train de préparer dans la nouvelle déclaration avec lui même objet de connexion. Comment dois-je réécrire ce que je puisse créer une déclaration préparée à l'avance ET de commencer à utiliser un rs2? Dois-je créer une nouvelle connexion de l'objet, même si la connexion est la même DB?
try
{
//Get some stuff
String name = "";
String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
name = rs.getString("name");
}
String sql2 = "SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";";
ResultSet rs2 = statement.executeQuery(sql2);
String updateSql = "INSERT INTO `blah`............";
PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);
while(rs2.next())
{
int id = rs2.getInt("id");
int stuff = getStuff(id);
pst.setInt(1, stuff);
pst.addBatch();
}
pst.executeBatch();
}
catch (Exception e)
{
e.printStackTrace();
}
private int getStuff(int id)
{
try
{
String sql = "SELECT ......;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
return rs.getInt("something");
}
return -1;
}//code continues
source d'informationauteur samxli
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est de la façon de récupérer les données dans
getStuff()
. Chaque fois que vous visitezgetStuff()
vous obtenir une nouvelleResultSet
mais vous n'avez pas le fermer.Cela viole l'attente de la
Statement
classe (voir ici - http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):Ce qui rend les choses encore pire, c'est le
rs
du code appelant. Il est également à l'origine hors de lastatement
terrain, mais il n'est pas fermé.Bottom line: vous avez plusieurs
ResultSet
concernant le mêmeStatement
objet ouvert simultanément.Je suppose qu'après
while(rs2.next())
vous essayez d'accéder à quelque chose de rs1. Mais il est déjà fermé depuis vous reexecuted pour obtenir rs2. Puisque vous n'avez pas la fermer, je crois qu'il est utilisé à nouveau ci-dessous.