2015-06-26 1 views
0

У меня возникли проблемы с получением данных из базы данных MySQL в моем сервлете Java. Для справки мое веб-приложение построено как библиотека - вы можете проверить элементы и проверить их обратно.(JAVA/SQL) ResultSet возвращает только одну строку из MySQL, когда она должна получить больше

Когда вы впервые нажмете «проверить», ваш запрос будет отправлен администратору, давайте позвоним этому человеку библиотекарь, который должен одобрить или отклонить ваш запрос. Предположим, что я вхожу в систему, выбираю некоторые предметы и нажимаю «checkout». Вот что происходит:

  1. Элементы добавляются в моей «корзину»
  2. В главном списке элементов на базе данных, каждый элемент имеет VARCHAR под названием STATUS, который идентифицирует ли этот элемент "In Stock". Для каждого элемента, который я выбрал, эта переменная изменяется на уникальный идентификатор, связанный с моей учетной записью пользователя.
  3. Мой запрос будет добавлен в таблицу под названием requests_list

Утверждение, общая регистрация, и так далее работают нормально. Что не так хорошо работает, это нажать «отклонить». Вот что должно произойти:

  1. Запрос получает удален из requests_list
  2. запрашивающего «корзину» товаров получает усечен
  3. Элементы сами получить объявили "In Stock"

Вот что случилось:

  1. Запрос удаляется с requests_list
  2. запрашивающего «корзину» товаров получает усечен
  3. Только первый элемент в корзине получает перепроверял в

Вот код, я работаю с до сих пор:

stmt.execute("DELETE FROM requests_list WHERE UNIQUE_ID = '" 
         + selected_ID + "'"); // this seems to work 

stmt.execute("TRUNCATE TABLE checkout_" + selected_ID); // also seems to work 

ResultSet all_gear = stmt 
         .executeQuery("SELECT * FROM gear_master_list"); 

while (all_gear.next()) { 
    if (all_gear.getString(5).equals(selected_ID)) { 
     stmt.execute("UPDATE gear_master_list SET STATUS = 'In Stock' WHERE ID_NUM = " 
           + all_gear.getInt(6)); 
    } 
} 

all_gear.close(); 

Некоторые примечания, чтобы объяснить некоторые из переменных:

  • selected_ID - библиотекарь щелкает раскрывающийся для доступа к списку пользователей, которые сделали запросы. После того, как он или она выбирает один, уникальный идентификатор этого пользователя становится selected_ID
  • checkout_selected_ID - Ваша «корзина» - это таблица в базе данных.Эта таблица названа в честь вашего уникального ID, так что если мой уникальный идентификатор был зайчиками, мой стол был бы checkout_bunnies
  • stmt и Connection рисует его Statement от все действительна и работы
  • gear_master_list является таблицей со всей шестерней , all_gear.getInt(6) ссылается на уникальный инвентарный номер, что каждая часть передач имеет, и all_gear.getString(5) является STATUS переменной я упомянул

Я пытался сделать это по-другому, так что код проходит через все элементы в корзине, обновляет статус, а затем обрезает таблицу. Это тоже не сработало - по-прежнему было сложно обновить статус, и таблица не будет усекать.

TL; DR: Мои ResultSet только получать мне одну строку из моей таблицы (я думаю), даже если я использую while петлю и есть больше чем одна строка. Что происходит? Есть ли лучший, более эффективный способ сделать это?

+0

есть вы отлажена, что у вашего Resultset есть все предметы, также поделитесь вашей ошибкой. – SSH

ответ

0

Это может быть проблема одновременной модификации - ваш первый запрос содержит курсор в базе данных и, перейдя по этому курсору, вы выполняете обновления по тем же данным, все в рамках одной и той же транзакции.

Не могли бы вы попробовать это?

stmt.execute("DELETE FROM requests_list WHERE UNIQUE_ID = '" 
      + selected_ID + "'"); // this seems to work 

    stmt.execute("TRUNCATE TABLE checkout_" + selected_ID); // also seems to 
                  // work 

    ResultSet all_gear = stmt 
      .executeQuery("SELECT * FROM gear_master_list"); 

    List<String> gear_items = new ArrayList<>(); 
    while (all_gear.next()) { 
     gear_items.add(all_gear.getString(5)); 
    } 
    all_gear.close(); 

    for (String gear_item: gear_items){ 
     if (all_gear.getString(5).equals(selected_ID)) { 
      stmt.execute("UPDATE gear_master_list SET STATUS = 'In Stock' WHERE ID_NUM = " 
        + all_gear.getInt(6)); 
     } 
    } 

    stmt.close(); 
+0

Большое спасибо! С помощью нескольких модификаций это решило мою проблему. Я должен сделать! – jpabene

+0

Спасибо :) Надеюсь, вы доберетесь до других SO-ers! – hugh

0

Огромное спасибо Хью за его большую помощь в этом вопросе - его ответ правильный. Мне просто пришлось внести пару модификаций, чтобы помочь ему ответить на мой код.

В случае, если у кого-либо еще есть эта проблема, hugh был прав, что это одновременная модификация проблема. Тем не менее, существует одна небольшая опечатка в своем ответе (ResultSet закрывается перед тем некоторые утверждения называются), поэтому я решил, что после моего измененного кода только в случае, если она оказалась полезной для тех, кто:

stmt.execute("DELETE FROM requests_list WHERE UNIQUE_ID = '" + selected_ID + "'"); // this seems to work 

stmt.execute("TRUNCATE TABLE checkout_" + selected_ID); // also seems to work 

ResultSet all_gear = stmt.executeQuery("SELECT * FROM gear_master_list"); 

ArrayList<Object[]> gear_items = new ArrayList<Object[]>(); 
while (all_gear.next()) { 
    Object[] added = new Object[2]; 
    added[0] = all_gear.getString(5); 
    added[1] = all_gear.getInt(6); 
    gear_items.add(added); 
} 
all_gear.close(); 

for (Object[] gear_item : gear_items) { 
    if (gear_item[0].equals(selected_ID)) { 
     stmt.execute("UPDATE gear_master_list SET STATUS = 'In Stock' WHERE ID_NUM = " + gear_item[1]); 
    } 
} 

stmt.close(); 

// thanks again to hugh!