2015-10-03 2 views
1

Этот вопрос является непрерывность этого:SQL: Vehicule добавляется в базу данных, но не его вариантов

Click here

У меня нет каких-либо исключений, брошенный больше. Данные добавляются в таблицу vehicule, но не в таблицу vehicule_option.

У вас есть идеи, почему?

public boolean create(Vehicule v){ 
    String query = "INSERT INTO vehicule (MARQUE, MOTEUR, PRIX, NOM) VALUES ("; 
    query += v.getMarque().getId() + ", " 
      + v.getMoteur().getId() + ", " 
      + v.getPrix() + ", \'" 
      + v.getNom() + "\');"; 

    try{ 
     connect.setAutoCommit(false); 
     ResultSet nextID = connect.prepareStatement("CALL NEXT VALUE FOR seq_vehicule_id").executeQuery(); 
     if (nextID.next()){ 
      int ID = nextID.getInt(1); 
      v.setId(ID-1); 
     } 

     for (Option o : v.getOptions()){ 
      System.out.println(v.getId() + " " + o.getId()); 
      query += "INSERT INTO vehicule_option (id_vehicule, id_option) VALUES (" 
        + v.getId() + ", " + o.getId() + ");"; 
     } 

     Statement state = this.connect.createStatement(); 
     ResultSet rs = state.executeQuery(query); 

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

    return true; 
} 

Вот пример запроса я получаю с этим кодом:

INSERT INTO vehicule (MARQUE, MOTEUR, PRIX, NOM) VALUES (0, 0, 250.0, 'test'); 
INSERT INTO vehicule_option (id_vehicule, id_option) VALUES (34, 0); 
INSERT INTO vehicule_option (id_vehicule, id_option) VALUES (34, 1); 
INSERT INTO vehicule_option (id_vehicule, id_option) VALUES (34, 2); 
INSERT INTO vehicule_option (id_vehicule, id_option) VALUES (34, 3); 
INSERT INTO vehicule_option (id_vehicule, id_option) VALUES (34, 4); 
+0

Я не уверен в этом, но я не думаю, что вы можете выполнить кучу операторов, разделенных точкой с запятой, таким образом, как вы пытаетесь это сделать. Вы должны выполнять каждое заявление отдельно. –

+1

Вы совершаете транзакцию? Вы устанавливаете 'setAutoCommit (false)', но я не вижу, чтобы вы вызывали 'commit()' – tddmonkey

ответ

1

Пожалуйста, найдите обновленный код ниже. Смотрите комментарии инлайн:

public boolean create(Vehicule v) { 
     String query = "INSERT INTO vehicule (MARQUE, MOTEUR, PRIX, NOM) VALUES ("; 
     query += v.getMarque().getId() + ", " + v.getMoteur().getId() + ", " 
       + v.getPrix() + ", \'" + v.getNom() + "\')"; 

     try { 
      connect.setAutoCommit(false); 
      ResultSet nextID = connect.prepareStatement(
        "CALL NEXT VALUE FOR seq_vehicule_id").executeQuery(); 
      if (nextID.next()) { 
       int ID = nextID.getInt(1); 
       v.setId(ID - 1); 
      } 

      /* Save vehicle */ 
      Statement state = this.connect.createStatement(); 
      state.executeUpdate(query); 

      /* Now start with creating query for vehicle_option. Execute only if collection not empty */ 
      if (!v.getOptions().isEmpty()) { 
       query = "INSERT INTO vehicule_option (id_vehicule, id_option) VALUES "; 
       boolean valueAdded = false; 
       for (Option o : v.getOptions()) { 
        System.out.println(v.getId() + " " + o.getId()); 
        if (valueAdded) { 
         query += ", "; 
        } 
        query += "(" + v.getId() + ", " + o.getId() + ")"; 
        valueAdded = true; 
       } 

       state = this.connect.createStatement(); 
       state.executeUpdate(query); 
      } 
      /* Commit inserts if all queries executed fine */ 
      connect.commit(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

     return true; 
    } 

предлагает вам заменить конкатенации строк с StringBuilder для построения запросов.

+0

Этот код doesn «Я работаю Джеймсом, но вы положили меня на правильный путь, ответ на самом деле должен был поставить connect.setAutoCommit (true) после теста if, теперь он отлично работает. Я редактирую ваш ответ. Btw –

+0

Я не вижу причины, почему вы сказали, что это не работает. –

+0

, потому что это бросило то же самое исключение. И я сейчас груб, спасибо за усилия и ответ :) –

1

Я бы ожидать

std.execute(sql); 

каждый раз, когда вы хотите вставить что-то, ExecuteQuery для «SELECT "ResultSet,

Предлагаю некоторые рекомендации по улучшению кода

  1. Поместите заявление за пределы попытки улова (вам нужно закрыть его, наконец,).

  2. Каждый раз, когда вам нравится вставлять use statement.execute (sql). (следовательно, у вас будет одна перед вашей петлей, чтобы вставить автомобиль и одну внутреннюю часть вашей петли для всего транспортного средства (это можно было бы также улучшить с помощью подготовленного состояния, но на этом оставим это на данный момент).

  3. Чтобы получить идентификатор вставленный поиск записей для statement generated keys, не говоря ваш Metod не работает, но таким образом избежать запроса (если БД поддерживает сгенерированный ключ)

+0

Собственно, первая часть запроса работает нормально, потому что вставляется транспортное средство. v.getOptions() имеет в нем варианты, я сделал печать, чтобы убедиться, что –

1

проблема, которую я вижу, когда вы первый CALL NEXT VALUE FOR seq_vehicule_id вы получите идентификатор, но это Wouldnt такой же, как у vehicule_option.

Рядом вы делаете (ID-1) dont know why? следующая вещь получить казнены является INSERT INTO vehicule, который также сгенерирует новый seq_vehicule_id

Так что, если вы начинаете с seq_id = 10 тогда next value будет 11 вы получите id-1 -> 10 для варианта ... и INSERT INTO vehicule будет использование 12

Так что я рекомендую получить vehicule_id и INSERT INTO vehicule values (Vehicule_Id вместо использования по умолчанию.

Также было бы здорово, если вы покажете нам финальную строку для query. В отличие от других комментариев, я думаю, вы можете сделать query1; query2; без проблем. Но с окончательной строкой запроса вы можете проверить синтаксис в прямом доступе к DB.

+0

Привет! Идентификатор точно такой же, я проверил его. Я редактировал сообщение, чтобы показать пример запроса. –

+0

Не могли бы вы показать мне, как вы отредактируете код? –

+0

что вы имеете в виду 'edit code'? Это использование одной обратной цитаты '\' 'между текстом, который вы хотите выделить. Вы пытаетесь запустить этот код в db? –

Смежные вопросы