2015-06-26 25 views
0

我在從我的Java servlet中的MySQL數據庫檢索數據時遇到了一些問題。作爲參考,我的網站應用程序的結構類似於圖書館 - 您可以檢出項目並將其重新檢入。(JAVA/SQL)ResultSet只從MySQL檢索一行,當它應該檢索更多

當您第一次單擊「檢出」時,您的請求會發送給管理員,讓我們給該人員打電話圖書管理員,他必須批准或不批准你的請求。比方說,我登錄,挑選一些項目,並點擊「結帳」。這裏是發生了什麼:

  1. 的項目將加入到我的「購物車」
  2. 在數據庫中的項目的主列表,每個項目都有一個VARCHAR稱爲STATUS,其中確定該項目是否爲"In Stock"。對於我選擇的每個項目,該變量將被更改爲與我的用戶帳戶關聯的唯一標識符。
  3. 我的請求被添加到表名爲requests_list

審批,一般辦理登機手續,等等,做工精細。什麼不能很好地點擊「拒登」。以下是應該發生的事情:

  1. 的請求被從requests_list
  2. 請求者的物品被截斷
  3. 項目本身獲得申報"In Stock"

這裏就是一直在發生的事情「購物車」中刪除:

  1. 該請求被從中刪除210
  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命名的,所以如果我的唯一的ID是兔子,我的表是checkout_bunnies
  • stmt並提請ConnectionStatement從都是有效和工作
  • gear_master_list是所有的裝備表,all_gear.getInt(6)引用每一件裝備具有獨特的庫存數量,以及all_gear.getString(5)STATUS可變我提到

我曾嘗試不同的這樣做,這樣的代碼,通過在車中的所有項目運行,更新狀態,然後截斷表。那也不管用 - 對於更新狀態仍然很挑剔,並且表格不會被截斷。

TL; DR:ResultSet只讓我從我的表中的一行(我認爲),即使我用while循環,並有超過一排。這是怎麼回事?有沒有更好,更有效的方法來做到這一點?

+0

有你調試的是您的結果集中了所有的項目,也分享你的錯誤跟蹤.. – 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!