2016-01-11 3 views
0

Dans mon programme, j'exécute certaines requêtes SQL avec JDBC. Quand je lance le programme pour cette certaine requête, je reçois l'erreur suivante:SQLException lors de l'exécution d'une requête avec JDBC

SQLException: Exception dans le thread « principal » java.sql.SQLException: à TransformData.main (TransformData.java:213)

Voici cette partie du code:

try 
    { 
     dbcon = DriverManager.getConnection(url,"username","password"); 
     stmt = dbcon.createStatement(); 
     stmt1 = dbcon.createStatement(); 
     stmt13 = dbcon.createStatement(); 
     stmt14 = dbcon.createStatement(); 
     String sql1 = "SELECT DISTINCT payer_id FROM transactions ORDER BY payer_id"; 
     rs1 = stmt1.executeQuery(sql1); 

     while (rs1.next()) 
     { 
      Integer payer_id = rs1.getInt("payer_id"); 
      payer_ids.add(payer_id); 
     } 
     rs1.close(); 
     stmt1.close(); 
     for(int i = 0; i < payer_ids.size(); i++) 
     { 
      String sql13 = "SELECT COUNT(*) AS counter, isCOrporate FROM transformed_table WHERE payer_id = "+payer_ids.get(i)+" "; 
      rs5 = stmt13.executeQuery(sql13); 
      while(rs5.next()) 
      { 
       int counter = rs5.getInt("counter"); 
       int isCorporate = rs5.getInt("isCorporate"); 
       if ((counter - payer_ids.get(i).intValue() - isCorporate) < 1) 
       { 
        String sql14 = "DELETE FROM transformed_table WHERE payer_id = "+payer_ids.get(i)+" "; 
        stmt14.executeUpdate(sql14); 
       } 
      } 
     } 
     rs5.close(); 
     stmt13.close(); 
     stmt14.close(); 

     dbcon.close(); 
    } 
    catch(SQLException e) 
    { 
     System.out.print("SQLException: "); 
         throw new SQLException(errorMessages); 

    } 

ligne 213 est cette ligne: throw new SQLException(errorMessages); des prises. J'essaie de trouver ce qui pourrait lancer cette exception. Quelqu'un peut-il aider?

+0

Lequel est la ligne 213? –

+0

@PritamBanerjee J'ai dit que dans ma question, 'lancer une nouvelle SQLException (errorMessages);' –

+0

Oh Okay. Mon mauvais –

Répondre

3

Il y a beaucoup de choses qui ne vont pas avec ce code, mais voici l'indice pertinent: Votre bloc de capture est faux. Ecrivez comme suit:

catch(SQLException e) { 
    e.printStackTrace(); 
} 

Votre chemin draine toutes les informations utiles de la trace de la pile. Vous ne pouvez pas déboguer ce que vous avez mal fait.

Effectuez la modification, réexécutez le code et lisez la trace de la pile. Cela vous dira quel est votre vrai problème.

Tant de choses à corriger:

  1. ressources ne sont pas fermées correctement. Cela devrait être fait dans des blocs try/catch individuels dans un bloc finally.
  2. Langage mal écrit. Le DELETE pourrait être fait beaucoup plus efficacement avec un JOIN.
  3. Mauvaise décomposition. Il y a 2 ou 3 méthodes qui se cachent ici.
  4. Aucun gestionnaire de transactions; pas d'ACID.
  5. Pas de regroupement de connexions; devrait être passé dans cette méthode plutôt qu'être instancié dans la portée.
  6. Doit utiliser PreparedStatement et lier plutôt que de concaténer String.

Je ne suis pas certain, mais il semble que vous avez trois requêtes SQL:

  1. SELECT tous les ID de payeur
  2. Obtenir un nombre d'ID de payeur
  3. supprimer tous les ID de payeur dans la liste que vous avez obtenue de SELECT.

Est-ce que je l'ai lu correctement? Si oui, pourquoi ne le faites-vous pas dans une requête, comme ceci?

DELETE 
FROM transformed_table 
WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions) 
+0

La seconde requête comportait des erreurs. Je la corrige et le programme s'exécute. Je ne sais pas si cela peut être écrit dans une requête maintenant. Cependant, ce 'e.printStackTrace();' était vraiment utile. Merci beaucoup! –