C’est parti pour le bug report
Donc, j’ai un client faisant tourner (entre autres) un thread qui “écoute” une BD Oracle (11g) via un JavaBeans (driver jdbc Oracle - ojdbc6.jar récupéré sur le site d’Oracle), et qui, dans l’idéal, va récupérer un ResultSet. Elle passe ce ResultSet à une fonction qui, pour chaque row, va créer un objet Produit maison contenant toutes ses infos. Cet object Produit est envoyé à un serveur qui va, via un autre JavaBeans, tenter d’insérer le tuple dans une BD MySQL. Si l’insertion se fait bien (ce qui est le cas), il faut supprimer le tuple correspondant dans la BD Oracle (d’où mon besoin d’appeler la méthode deleteRow() du ResultSet) => C’est à cet endroit que j’ai une SQLException me disant que le ResultSet est read-only.
Le code du thread:
ResultSet rs;
while(true)
{
rs = bc.Detect();
if(rs != null)
{
JOptionPane.showMessageDialog(men, "Produits arrivé de la Centrale",
"Arrivage détecté", JOptionPane.INFORMATION_MESSAGE);
int res = Common.Prohap.askReceive(rs, men.conn);
if(res == -1)
JOptionPane.showMessageDialog(men, "L'arrivage n'a pu être enregistré",
"Erreur", JOptionPane.ERROR_MESSAGE);
else
JOptionPane.showMessageDialog(men, res + " produits enregistrés",
"Info", JOptionPane.INFORMATION_MESSAGE);
}
else
JOptionPane.showMessageDialog(men, "Pas de nouvel arrivage", "Info",
JOptionPane.INFORMATION_MESSAGE);
try
{
Thread.sleep(30 * 1000);
} catch(InterruptedException e) {
System.err.println("Erreur de délai entre les arrivages !");
}
}
Le code de la fonction Detect:
Statement stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); //conn = connection à la BD Oracle
String query = "SELECT * FROM ProduitsEnvoyes WHERE ID_SuperMarche = " + idSM; //idSM = numéro du supermarché concerné
System.out.println(query);
ResultSet rs = stm.executeQuery(query);
boolean res = rs.next();
if(res)
return rs;
rs.close();
stm.close();
return null;
la méthode qui fait le lien entre le client et le serveur:
try
{
int cpt = 0;
ObjectOutputStream oos = new ObjectOutputStream(conn.dos);
do
{
EnvoiProduit produit = new EnvoiProduit();
produit.idArticle = rs.getString("ID_Article");
produit.idConditionnement = rs.getInt("ID_Conditionnement");
produit.idEmballage = rs.getInt("ID_Emballage");
produit.DatePeremption = rs.getString("DatePeremption");
produit.prix = rs.getFloat("PrixVente");
produit.quantite = rs.getInt("Quantite");
conn.writeInt(1);
oos.writeObject(produit);
if(conn.readInt() == 0)
{
System.out.println("test pre delete");
rs.deleteRow(); //ça plante!
System.out.println("test post delete " + cpt);
cpt++;
}
} while(rs.next());
rs.close();
conn.writeInt(0);
return cpt;
} catch(SQLException e) {
e.printStackTrace();
System.err.println("Erreur SQL durant le transfert des produits reçus !");
return -1;
} catch(IOException e) {
System.err.println("Erreur d'envoi des infos produits reçus !");
return -1;
}
STACKTRACE:
java.sql.SQLException: Opération non valide sur un ensemble de résultats de type read-only: deleteRow
at oracle.jdbc.driver.BaseResultSet.deleteRow(BaseResultSet.java:999)
at Common.Prohap.askReceive(Prohap.java:354)
at Common.ThArrivages.run(ThArrivages.java:28)
Sinon:
- oui j’ai les droits nécessaires sur la table
- Ivru tu crois vraiment qu’un “Select toutes mes colonnes” au lieu d’un “Select *” va changer le comportement du resultset alors que je demande explicitement un CONCUR_UPDATABLE ?