2017-07-21 1 views
0

J'utilise le code ci-dessous pour récupérer les données de commande à partir de DB2 et cela fonctionne bien quand je ne fais que passer le BranchNumber et utilisé la fonction getWildcards() depuis que je suis passer plusieurs numéros de branches.comment passer plusieurs paramètres pour formater l'instruction Prepared en java

public List<Order> getallorders(List<Branch> BranchNumber) throws SQLException { 
     List<Order> orders = new ArrayList<Order>();   
     try {    
      StringBuilder sb = new StringBuilder(); 
      sb.append("SELECT ORDER_NUMBER as ordernumber,SERVICE_TYPE as service" 
        + "FROM ORDER WHERE " 
        + "BRANCH IN(");    
      sb.append(getWildCards(BranchNumber.size())).append(")").append(" WITH UR"); 
      String query = sb.toString(); 
      PreparedStatement statement = connection.prepareStatement(query);   
      for(int i=0 ; i<BranchNumber.size() ;i++) 
      { 
      statement.setInt(i+1,BranchNumber.get(i).getBranch()); 
      } 
      ResultSet resultSet = statement.executeQuery(); 
      { 
      while (resultSet .next()) { 
       Order order1 = new Order(); 
       order1.setOrdernumber(resultSet.getInt("ordernumber")); 
       orders.add(order1);     
      }    
      }    
     } 
     catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return orders; 
} 


    private String getWildCards(int size) { 
     // TODO Auto-generated method stub 
     StringBuilder sb = new StringBuilder(); 
     for(int i =0 ; i<size ; i++) 

     { 
      sb = (i == 0) ? sb.append("?") 
        : sb.append(",").append("?"); 

     } 
     return sb.toString(); 
    } 

Maintenant je dois passer le startDate et endDate dans la fonction pour récupérer les données, mais le PreparedStatement formate pas la requête select avec la valeur passée.

public List<Order> getallorders(List<Branch> BranchNumber,String startDate,String endDate) throws SQLException { 
     List<Order> orders = new ArrayList<Order>();   
     try {    
      StringBuilder sb = new StringBuilder(); 
      sb.append("SELECT ORDER_NUMBER as ordernumber,SERVICE as service" 
        + "FROM ORDER WHERE " 
        + "BRANCH IN(");    
      sb.append(getWildCards(BranchNumber.size())).append(")"); 
      sb.append("AND ORDERDATE BETWEEN ? and ? WITH UR"); 
      String query = sb.toString(); 
      PreparedStatement statement = 
connection.prepareStatement(query);    
      for(int i=0 ; i<BranchNumber.size() ;i++) 
      { 
      statement.setInt(i+1,BranchNumber.get(i).getBranch()); 
      } 
      ResultSet resultSet = statement.executeQuery(); 
      { 
      while (resultSet .next()) { 
       Order order1 = new Order(); 
       order1.setOrdernumber(resultSet.getInt("ordernumber")); 
       orders.add(order1);     
      }    
      }    
     } 
     catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return orders; 
} 

Quelqu'un peut-il s'il vous plaît me expliquer ce que je fais mal ici et comment je peux obtenir le PreparedStatement prévu, ci-dessous est la requête formatée à venir dans mon journal et message d'erreur enregistré,

SELECT ORDER_NUMBER as ordernumber,SERVICE_TYPE as service FROM .ORDER WHERE 
BRANCH_NUMBER IN(?) + AND ORDERDATE BETWEEN ? AND ? WITH UR 

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, 
SQLSTATE=42601, SQLERRMC=ORDER DATE BETWEEN ? AND;H_NUMBER IN(?) + AND; 
<order_siblings_by>, DRIVER=3.63.75 
at com.ibm.db2.jcc.am.fd.a(fd.java:679) 
+0

Vous avez pas défini la valeur de la marque en question PreparedStatement de cette ligne: 'sb.append;' ("ET AVEC ORDERDATE et UR?"). Cela peut conduire à ce que toutes vos déclarations pré-établies se trompent –

+0

Salut Tuyen, pouvez-vous s'il vous plaît laissez-moi savoir comment résoudre ce problème? – chimbu

Répondre

1

Chaque ? dans le prepareStatement devrait être attribué une valeur. Voici un exemple adopté de here:

String updateString = 
     "update " + dbName + ".COFFEES " + 
     "set SALES = ? where COF_NAME = ?"; 

    PreparedStatement updateSales = con.prepareStatement(updateString); 
    updateSales.setInt(1, 500); //set value to first `?` 
    updateSales.setString(2, "roasted"); //set value to second `?` 
+0

Merci c0der, j'ai mis à jour la partie de code comme ci-dessous et ça fonctionne bien quand je recherche le résultat pour le numéro de branche, mais ne fonctionne pas quand je passe plusieurs branches pour (int i = 0; i chimbu

+0

mis à jour le code comme ci-dessous et son maintenant a fonctionné comme prévu for (int i = 0; i chimbu