2012-11-10 70 views
1

我正在創建一個簡單的註冊框架,將記錄添加到數據庫中。它每次運行SQL查詢時都會給我一條錯誤消息,該查詢會在數據庫中添加記錄,但它仍然會添加它們,但是由於我的程序停滯不前,而不是打開另一個窗口。Java,代碼有效,但仍然拋出異常

這裏的那部分代碼:

regButton.addActionListener(new ActionListener() { 

@Override public void actionPerformed(ActionEvent e) { 
    //Execute when button is pressed 
    if( uNameField.getText().equals("") 
     || new String(newPassField.getPassword()).equals("") 
     || new String(repeatPassField.getPassword()).equals("")) { 
     errorLabel.setForeground(Color.red); 
     errorLabel.setText("Some fields are left blank"); 
    } 
    else if(new String(newPassField.getPassword()).equals(
      new String(repeatPassField.getPassword()))){ 
     Statement stmt; 
     ResultSet res; 
     try 
     { 
     //SET USERNAME AND PASSWORD FROM FIELDS TO UPPER CASE 
     String username = uNameField.getText().toUpperCase(); 
     String password = new String(newPassField.getPassword()).toUpperCase(); 
     //SQL INSERT QUERY 
     String sql; 
     sql = "INSERT INTO Employees VALUES ('" +username +"','" +password +"');"; 
     stmt = con.createStatement(); 
     res = stmt.executeQuery(sql); 
     System.out.println("Added to database!"); 
     con.close(); 
     } 
     catch(SQLException exe) { 
     System.out.println("Error creating or running statement: " + e.toString()); 
     try { 
      con.close(); 
     } 
     catch(Exception eex){} 
     } 
    } 
    else { 
     errorLabel.setForeground(Color.red); 
     errorLabel.setText("Password missmatch"); 
    } 
} 

每次它會註冊一個新員工(用戶)會顯示這一次「錯誤創建或運行語句:......」雖然,我可以找到員工列表中新增員工。

什麼可能導致此問題?

+3

你能打印你吞嚥並將其添加到您的問題除外(S)的堆棧跟蹤? – Thor84no

+1

你可以打印堆棧跟蹤通過使用變量'EXE' – Ankur

回答

2

您需要使用executeUpdate爲SQL INSERT語句

int rowCount = stmt.executeUpdate(sql); 
+0

當我改變它,我得到一個錯誤,說:「不兼容的類型,所需的java.sql.ResultSet,發現INT – Ivan

+0

你需要改變返回類型爲' int''請參閱更新 – Reimeus

4

在我們得到您的具體問題,一些一般性的建議:

Connection con = ... 
try { 
    // your stuff 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 
finally { 
    try { 
    con.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

你正在做它的方式,現在不僅吞下例外,但也避免打印它的堆棧跟蹤。無論例外情況如何,close都必須進行一次且僅限一次。

如果你是在Java 7中,這將是容易得多:

try (Connetion con = ...) { 
    // stuff to do 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

收盤在finally現在是自動完成的。

關於您的異常,請通過調用executeQuery執行INSERT。該方法將該語句發送給DB,該DB正確執行它,但其返回給JDBC的響應不是ResultSet。這是它爆炸的地方,已經插入記錄後。由於您處於自動提交模式,因此沒有事務可以回滾。課程:始終使用交易

+0

Java 7以更優雅的方式解決此問題 – Aubin

+0

@Aubin當然,如果它可用於OP。 –

1

我討厭用這種方式來看代碼。你沒有問過這個問題,我的評論也不能解決你的問題,但我認爲這需要說。

通過將持久代碼放入Swing Listener方法中,您正在爲自己創建維護夢魘。

一個更好的想法是以一種給他們一個責任的方式思考對象。

拿出你的持久化代碼,並將它移到一個單獨的類中,你可以自己開發和測試它。一旦它工作,給需要它的類提供參考。

您的代碼將更加模塊化,更易於測試,更易重複使用,更不用說理解噩夢。

鮑勃馬丁叔叔有一個簡潔的肺炎爲這個和其他想法值得記住:SOLID

+0

在所有可能情況下,都不會維護此代碼,但開始學習永遠不會太早正確的方式。 –

0

你爲什麼不嘗試的PreparedStatement

try{ 
    //SET USERNAME AND PASSWORD FROM FIELDS TO UPPER CASE 
    String username = uNameField.getText().toUpperCase(); 
    String password = new String(newPassField.getPassword()).toUpperCase(); 
    //SQL INSERT QUERY 
    PreparedStatement pstmt = con.prepareStatement("insert into Employees values(?,?)"); 
    pstmt.setString(1,username); 
    pstmt.setString(2,password); 

    if(!pstmt.execute()) 
    { 
     //means your code worked correctly 
     System.out.println("Inserted successfully"); 
    } 
    else 
    { 
      System.out.println("Unsuccessfull"); 
    } 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
相關問題