2015-11-14 53 views
-1

我正在處理用於收集客戶信息並將其存儲到名爲「BOOKINGS」的表中的項目該表具有列「CUSTOMERNAME」,「HOLIDAYNAME」 ,「MAGICIAN」和「TIMESTAMP」單擊按鈕時使用靜態方法將值插入數據庫表

我有一個名爲「DatabaseConnection」的類,它建立了與具有預訂表的數據庫的連接。該課程在項目的其他領域按預期發揮作用。在課堂上,我有一個名爲「addBooking」的靜態方法我有一個GUI類(使用Netbeans GUI生成器),它有一個操作執行的方法。下面是actionPerformed方法和addBooking方法的代碼...

private void bookButtonActionPerformed(java.awt.event.ActionEvent evt) {           


    String customerName = customerNameText.getText(); 
    String magician = (String)magicianCombo.getSelectedItem(); 
    String holiday = (String)holidayCombo.getSelectedItem(); 

    customerNameText.setText(null); 

    try { 
     DatabaseConnection.addBooking(customerName, holiday, magician); 
    } catch (SQLException ex) { 
     Logger.getLogger(GUI1Frame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
}   

我沒有發送任何信息,時間戳,因爲我還沒有想通的那部分,只是還沒有。以下是DatabaseConnection類中addBooking方法的代碼。

public static void addBooking(String name, String holiday, String employee) throws SQLException { 
    stmt.execute("INSERT INTO BOOKINGS (CUSTOMERNAME, HOLIDAYNAME, MAGICIAN) VALUES ('"+name+"','"+holiday+"','"+employee+"')"); 
}   

單擊該按鈕應該得到一個文本框(用戶名)的信息,從組合框(假日)和信息從另一個組合框(員工)的信息。我無法弄清楚它爲什麼不起作用,但是無論何時單擊該按鈕,程序將凍結約10-15秒,然後繼續,但是表中沒有信息輸入。任何幫助將不勝感激,謝謝。

編輯:增加了對的DatabaseConnection班上的其他

public class DatabaseConnection { 
String host = "jdbc:derby://localhost:1527/MagicianAgent"; 
String username = "java"; 
String password = "java"; 

static Connection con = null; 
ResultSet rs = null; 
static Statement stmt; 

DatabaseConnection() { 
    try { 
     con = DriverManager.getConnection(host, username, password); 
     stmt = con.createStatement(); 
    } 
    catch(SQLException err) { 
     System.out.println(err.getMessage()); 
    } 
} 

public ResultSet getRS(String sql) { 
    try { 
     rs = stmt.executeQuery(sql); 
    } 
    catch(SQLException err) { 
     System.out.println(err.getMessage()); 
    } 
    return rs; 
} 

編輯2代碼:這是一些代碼,我在的主要方法。

Holiday holidayList = new Holiday(); 
    Magician magicianNames = new Magician(); 
    arrays = magicianNames.getMagicianNames(); 
    for(int e = 0; e < arrays.size(); e++) { 
     magicianCombo.addItem(arrays.get(e)); 
    } 
    arrays = holidayList.getHolidayList(); 
    for(int e = 0; e < arrays.size(); e++) { 
     holidayCombo.addItem(arrays.get(e)); 
    } 

在節日和魔術師建設者,他們訪問過的DatabaseConnection數據庫和節日的名稱和魔術師名的值存儲在一個ArrayList。然後,ArrayList項目被添加到組合框,直到到達ArrayList的末尾。我不確定這是否會改變任何事情的行爲,但我認爲我應該添加它。

+0

告訴我們更多關於'DatabaseConnection' – jtomaszk

+1

除了別的,你的'addBooking'方法應該是固定的使用參數化SQL。在處理SQL注入攻擊可能對業務造成威脅的任何實際代碼之前,請先了解*現在的習慣...... –

+0

通常,語句是使用查詢準備的,然後執行 - 什麼是「stmt」?此外,你的代碼容易受到[sql注入](http://stackoverflow.com/search?q=sql+injection):如果你輸入'','',''); DROP TABLE BOOKINGS --'在customerName字段中,.... – Kenney

回答

0

請勿預先創建Statement對象,並使用PrepareStatement來防範SQL語法錯誤和SQL Injection攻擊。

所以,你的代碼應該是:

public static void addBooking(String name, String holiday, String employee) throws SQLException { 
    String sql = "INSERT INTO BOOKINGS (CUSTOMERNAME, HOLIDAYNAME, MAGICIAN) VALUES (?,?,?)"; 
    try (PreparedStatement stmt = con.prepareStatement(sql)) { 
     stmt.setString(1, name); 
     stmt.setString(2, holiday); 
     stmt.setString(3, employee); 
     stmt.executeUpdate(); 
    } 
} 
+0

謝謝,我嘗試使用PreparedStatement,但它仍然凍結,並不會更新數據庫。我添加了更多信息。不知道它是否會有所幫助。 – Chris

+0

@Chris那條評論對我來說毫無意義。你沒有顯示「main」方法。你沒有使用'PrepareStatement'。 「不工作」是無用的評論。請明確點。或者說,創建一個新的問題。請給每個問題一個問題。 – Andreas

+0

@Chris並閱讀「[如何創建最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)」 – Andreas

相關問題