2016-11-06 54 views
0

所以我有一個犯了這樣的在Java的更新單行數據庫

{材料名稱; QUANTITY}數據庫

我也有一個JTable在Java中,從數據庫上傳信息(SQLite的)。當我編輯表格中的單元格時,它會以這種方式自動更新數據庫:

//table listener 
public void tableChanged(TableModelEvent e) { 
    //gets row and column if the table is edited 
    int row = e.getFirstRow(); 
    int column = e.getColumn(); 
    //change in sqlite 
    if (column == 1) { 
     int value = Integer.parseInt(table.getModel().getValueAt(row, column).toString()); 
     String materialId = table.getModel().getValueAt(row, column-1).toString(); 
     try (Connection c = DriverManager.getConnection("jdbc:sqlite:database.db"); Statement statement = c.createStatement()) { 
      String sql = "UPDATE MATERIALS set QUANTITY = " + value + " where MATERIAL='" + materialId +"';"; 
      statement.executeUpdate(sql); 
      statement.close(); 
      c.close(); 
     } catch (SQLException e1) { 
      e1.printStackTrace(); 
     } 
    } 
    else if (column == 0) { 
     int value = Integer.parseInt(table.getModel().getValueAt(row, column+1).toString()); 
     String materialId = table.getModel().getValueAt(row, column).toString(); 
     try (Connection c = DriverManager.getConnection("jdbc:sqlite:database.db"); Statement statement = c.createStatement()) { 
      String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';"; 
      statement.executeUpdate(sql); 
      statement.close(); 
      c.close(); 
     } catch (SQLException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

更新數量時可以。但是,一旦材料名稱更新,我不知道我應該如何在數據庫中更新它。

String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';"; 

也許有一種方法可以保存該值的以前的值?我不能使用可能重複的材料數量。

我想避免添加ID到對象如果可能的話。

+0

不相關,但是:***不***將值連接到SQL查詢中。學習正確使用'PreparedStatement'來代替。 –

回答

1

本聲明:

String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';" 

有二(三)問題。

  1. 「舊」值和「新」值是相同的。你有一個合乎邏輯的問題。

  2. WHERE部分連接在一起像字符串類型,但設置部位不

  3. 級聯是邪惡的。正確的方法做,這是

    String sql = "UPDATE MATERIALS set MATERIAL = ? where MATERIAL= ?"; 
    PreparedStatement prepstmt = conn.prepareStatement(sql); 
    prepstmt .setString(1, newMatewrial); 
    prepstmt .setString(2, oldMaterial); 
    prepstmt .executeUpdate(); 
    

的邏輯問題必須在您的概念來解決。

它似乎主要的問題是基本上不使用ID。關係數據庫中的每一行都應該有穩定的主鍵(像你說的ID)。名稱不是主鍵,因爲可以更改。

WHERE部分應該使用ID而不是名稱。

編輯:在我看來,好的JTable模型是解決您的問題的一種方法。

也許automagic默認表模型太差。實現Row的類應該有一個可以(或不可以)不可見的列(ID)。

我的英文不太流利,不能在SO後教關係型數據庫和Swing。

第二小代碼段不顯示您的應用程序概念。 閱讀谷歌約定製JTable模型

非常簡單的例子: http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm

+0

我有語法標記的麻煩,對不起 –

+0

是的,我知道它有邏輯問題,我正在尋找的解決方案是,如果有可能寫另一種形式的語句。我面對的問題是,我不確定應該如何獲取oldMaterial,因爲我在Java中使用的tablemodellistener只記錄已編輯的列和行索引。無論哪種方式,感謝您展示正確的順序是如何看起來的,從現在開始我肯定會在代碼中使用它! – KarolisShp