вложенный цикл не будет выполнять запросы во внутреннем цикле длиной более 1 - PullRequest
2 голосов
/ 24 августа 2011

Извините, ребята, я не смог предоставить отзыв из-за моего другого имени пользователя и пароля здесь, в любом случае здесь проблема:

Я работаю над основанным на SOAP веб-сервисом, где в какой-то части мне приходится выполнять некоторые запросы к базе данных, используя вложенный цикл, проблема в том, что внутренний цикл выполняется только ОДИН раз, прежде чем сдаться. Это код:

for(int i=0; i<selec.length; i++){
  for(int j=0; j<sintom.length;j++){
    var[(i*sintom.length)+j] = 
      "INSERT INTO malattia (nome, eta,  descrizione, sesso, etnia, sintomi) "
      + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" 
      +  sexarra[0] + "','" + selec[i] + "','" + sintom[j] + "')";
  }
}

Здесь должны выполняться запросы:

if (errore.equals("")) {
  try {
    Statement st = conn.createStatement();
    for(int i=0; i<selec.length; i++){
      for(int j=0;j<sintom.length;j++){
        st.executeUpdate(var[(i*sintom.length)+j]);
      }
    }

Что происходит, так это то, что независимо от размера select он будет работать нормально, если длина sintom равна 1, больше 1 и не будет работать.

UPDATE
Я только что использовал подготовленное утверждение, но проблема сохраняется, если длина внутреннего цикла больше 1, это не сработает! вот код внесенных мною изменений:

if (errore.equals("")) {
  try {
    /*  Statement st = conn.createStatement();
        Statement[] si=new Statement[selec.length];
        for(int i=0;i<selec.length;i++)
        si[i]=conn.createStatement();               */
   PreparedStatement ps = conn.prepareStatement(
     "INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) 
      values (?, ?, ?, ?, ?, ?)");


     for(int i=0; i<selec.length; i++){
       for(int j=0;j<sintom.length;j++){
         //  si[i].executeUpdate(var[(i*sintom.length)+j]);
         ps.setString(1, malattia);
         ps.setInt(2, eta);
         ps.setString(3, descrizione);
         ps.setString(4, sexarra[0] );
         ps.setString(5, selec[i]);
         ps.setString(6, sintom[j]);
         ps.executeUpdate();
       }
     }
   }  
   //st.executeUpdate(q);
   ps.close();
   conn.close();
   ris = "si";

Полный код сервера:

             public String aggiungi_malattia(String malattia, int eta, String descrizione, String[] sexarra, String[] selec, String[] sintom) {
        String ris = "no";
         String errore = connetti();
         if (errore.equals("")) {
              try {
               PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) values (?, ?, ?, ?, ?, ?)");
          else {  
            for(int i=0; i<selec.length; i++){
                for(int j=0;j<sintom.length;j++){

                   //  si[i].executeUpdate(var[(i*sintom.length)+j]);
                   ps.setString(1, malattia);
                   ps.setInt(2, eta);
                   ps.setString(3, descrizione);
                   ps.setString(4, sexarra[0] );
                   ps.setString(5, selec[i]);
                   ps.setString(6, sintom[j]);

                   ps.executeUpdate();
                }
               }
            }



                   //st.executeUpdate(q);
                    ps.close();
                    conn.close();
                    ris = "si";
              } catch (SQLException e) {
                    System.out.println("Errore: " + e.getMessage());
                    return ris;
              }
        }
        return ris;
  }

Сервер отправляет обратно ris , что равно si или no в зависимости от успеха запроса, здесь я получаю si если sintom , которая равна длине внутреннего цикла, равной 1, в противном случае я получаю нет Я не знаю точно, что заставляет его ответить нет , кроме того это веб-сервис на основе SOAP, я могу отлаживать клиентскую часть системы, а не серверную часть

1 Ответ

0 голосов
/ 24 августа 2011

После того, как я часами бился головой, проблема в базе данных !!Что случилось, так как столбец sintomi был FK, ссылающимся на таблицу Sintomi, которая была многозначной, поэтому он был первичным ключом таблицы malattia, поэтому значения, которые я передавал, должны были уже присутствовать втаблица sintomi, поэтому столбец sintomi может ссылаться на нее !!В любом случае было бы невозможно понять это из предоставленной мною информации. Спасибо всем!как всегда здорово, вы, ребята, здесь, когда все выходит из-под контроля.

...