2016-12-29 51 views
-3

我寫了這段代碼來更新德比數據庫中的病人,但它拋出了一個SQLSyntaxErrorException。我錯過了什麼嗎?更新德比數據庫異常

public void updateInDatabase(int ID,String sex, String firstName, String familyName, String eMail) { 
    try { 
     String sql = "UPDATE PATIENT SET sex = "+ sex +" WHERE NR = "+ID; 
     st.executeUpdate(sql); 
     String sq2 = "UPDATE PATIENTEN SET FIRSTNAME=" + firstName + "WHERE NR=" + ID; 
     st.executeUpdate(sq2); 
     String sq3 = "UPDATE PATIENTEN SET FAMILYNAME=" + familyName + "WHERE NR=" + ID; 
     st.executeUpdate(sq3); 
     String sq4 = "UPDATE PATIENTEN SET EMAIL=" + eMail + "WHERE NR=" + ID; 
     st.executeUpdate(sq4); 
    } catch (SQLException ex) { 
     Logger.getLogger(DbManagerPatienten.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
+1

是的,你錯過了使用PreparedStatement'的'防止語法錯誤和[SQL注入](https://en.wikipedia.org/wiki/SQL_injection)攻擊,黑客會竊取你的數據並刪除你的表。 – Andreas

+2

至於問題本身,你錯過了向你展示完整的錯誤信息和導致它的原因的部分。通常最好發佈完整的堆棧跟蹤。 – Andreas

+1

問:是否故意更新兩個不同的表格('PATIENT'和'PATIENTEN')?爲什麼執行3個不同的'UPDATE'語句來更新同一個表的3個不同列。在一個聲明中會這麼做會更好。 – Andreas

回答

2

您的主要錯誤是您使用字符串連接,這將使您容易受到SQL Injection攻擊。

您的具體錯誤是您沒有引用文本值。

String sql = "UPDATE PATIENT SET sex = "+ sex +" WHERE NR = "+ID; 

這具有以下SQL語句sql的Java語句結果:

UPDATE PATIENT SET sex = male WHERE NR = 42 

語句應該是:

UPDATE PATIENT SET sex = 'male' WHERE NR = 42 

然而,在Java中做到這一點,正確的做法是使用PreparedStatement,並使用試用資源。

更多信息請參閱以下內容:

String sql = "UPDATE PATIENT" + 
       " SET SEX = ?" + 
        ", FIRSTNAME = ?" + 
        ", FAMILYNAME = ?" + 
        ", EMAIL = ?" + 
      " WHERE NR = ?"; 
try (PreparedStatement stmt = conn.prepareStatement(sql)) { 
    stmt.setString(1, sex); 
    stmt.setString(2, firstName); 
    stmt.setString(3, familyName); 
    stmt.setString(4, eMail); 
    stmt.setInt (5, ID); 
    int updateCount = stmt.executeUpdate(); 
    if (updateCount == 0) 
     throw new IllegalArgumentException("Patient not found: " + ID); 
}