2013-05-30 3 views
0

Le problème semble être avec la syntaxe 'générique' dans les méthodes setInt et setString. - Bien sûr, il pourrait y avoir d'autres problèmes, mais laissez-moi vous dire ce que j'ai trouvé.mon donne un resultSet vide. Mon JTable est vide. Il ne devrait pas être

Voici ma table dans mySql que j'essaye d'interroger en utilisant java.

Id | CashFlowSensitive | Sp1 
----------------------------------- 
    37 |     1 | Hello 
1000 |     0 | Hello 
1401 |     0 | number3 
1500 |     0 | number4 
1504 |     1 | Hello 

Si le code I comme « me donner toutes les lignes où CashFlowSensitive = 1 et Sp1 = « Bonjour », puis mon code fonctionne. Il me donne la première et la dernière rangée car elles correspondent exactement aux critères de filtrage.

Maintenant, imaginez que je change la dernière ligne de ma table, en remplaçant l'entrée Hello par number5. Le tableau ressemble alors à ce

Id | CashFlowSensitive | Sp1 
----------------------------------- 
    37 |     1 | Hello 
1000 |     0 | Hello 
1401 |     0 | number3 
1500 |     0 | number4 
1504 |     1 | number5 

Enfin, je lance ma requête lui demandant de me donner toutes les lignes où « CashFlowSensitive » = 1. je devrais obtenir 37 et 1504. Malheureusement, cela donne une resultSet vide. Mon JTable est vide. Dans cet exemple, à défaut je fais:

public void searchStringTest(DefaultTableModel model, Database db, int CashFlowSensitive, String Sp1) 
{ 
    int first = -77; 
    String second = "-55"; 

    String queryTest = " select * from helm.activitiesextended where CashFlowSensitive = ? and Sp1 = ? "; 

    try 
    { 
     java.sql.PreparedStatement selectStmt = CON.prepareStatement(queryTest); 

     if (first == -77) { 
      ((PreparedStatement) selectStmt).setInt(1, 1); 
     } else { 
      ((PreparedStatement) selectStmt).setInt(1, '%' + CashFlowSensitive + '%');  
     } 

     if (second == "-77") { 
      ((PreparedStatement) selectStmt).setString(2, "Hello"); 
     } else { 
      ((PreparedStatement) selectStmt).setString(2, "%" + Sp1 + "%"); 
     }    

     ResultSet rsTest = selectStmt.executeQuery(); 

     model.setRowCount(0);   

     while (rsTest.next())    
     { 
      Vector <Object> vector = new Vector<Object>(); 
      for (int columnIndex = 1; columnIndex <=4; columnIndex ++) 
      { 
       vector.add(rsTest.getObject (columnIndex));// pick next column 
      } 
      data.add(vector); 

      model.addRow(vector); 
     } 

J'ai un searchString déclaré (int CFS, int ToBeMonitored, String Sp1, String Sp2, String Sp3 et un ajout de 7 paramaters) Je définis ma chaîne de requête comme : sélectionnez * dans la table où CFS =? et ToBeMonitored =? et Sp1 =? et Sp2 =? et Sp3 =? etc énumérant dix paramètres. Maintenant, à n'importe quelle exécution de cette requête, j'active seulement 4 paramètres maximum, par exemple disons que je veux filtrer 2 par: CFS et Sp1, les paramètres restants devraient être neutres au processus de filtrage, je l'appelle 'neutre'. Ce faisant, j'ai mis en place des instructions préparées ((PreparedStatement) selectStmt) .setInt (1, 1); // filtre sur celui-ci ((PreparedStatement) selectStmt) .setInt (2, '%' + ToBeMonitored + '% '); // accepte n'importe quelle valeur ((PreparedStatement) selectStmt) .setString (3, "Hello"); // filtre sur celui-ci ((PreparedStatement) selectStmt) .setString (4, "%" + Sp2 + "%") ; ((PreparedStatement) selectStmt) .setString (5, "%" + Sp3 + "%"); Comme vous pouvez le voir, je focalise mon sql pour honorer les paramètres 1 et 3 tout en ignorant les autres paramètres, en les rendant neutres dans le processus de filtrage. Problème: aucun ensemble de résultats créé malgré des données valides.

Votre réponse est un peu hors de la question que j'ai soulevée. Je veux que vous honoriez le fait que la même chaîne de requête doit être conservée encore et encore, quels que soient les paramètres que je veux filtrer à chaque exécution séparée. Par exemple, si je n'active que l'indicateur CashFlowSensitive, ce paramètre particulier doit être le paramètre actif lors de l'exécution de la requête. Les autres paramètres doivent se comporter de manière neutre pour le processus de filtrage. À d'autres moments, je peux choisir d'activer le champ Sp1 (un champ CHAR) alors les autres champs devraient rester inactifs. Toujours à d'autres occasions je peux choisir une combinaison de plusieurs champs, ceux qui devraient être actifs et les champs non choisis devraient être neutres. Permettez-moi de réduire la portée de votre mission. 1) Dites-moi comment interroger un champ CHAR en utilisant des paramètres de liaison où le champ devrait être neutre dans le processus de filtrage, en d'autres termes tout contenu devrait être accepté. 2) Pouvez-vous également me dire comment vérifier la chaîne de requête générée par le logiciel?

Répondre

1

Le problème est de transmettre la valeur du second paramètre dans le chemin else.Votre requête finale ressemblera à:

select * from helm.activitiesextended 
where CashFlowSensitive = 1 and Sp1 = '%<value of Sp1>%' 

Ceci évidemment ne renvoie aucun enregistrement. Vous devriez interroger seulement le premier paramètre, si vous en avez juste besoin. Quelque chose comme:

select * from helm.activitiesextended where CashFlowSensitive = 1