2013-02-19 52 views
0

我已經編寫了一個程序,負責註冊,每當我嘗試在不同的id中插入多個新用戶時,它會給出錯誤消息: java.sql.SQLIntegrityConstraintViolationException:語句被中止,因爲它會在'STCEPARTICIPANTS'上定義的'SQL130217122630580'標識的唯一或主鍵約束或唯一索引中導致重複的鍵值。在java數據庫(derby)中反覆插入多個數據給出錯誤

這裏是一個按鈕,指示數據傳遞的動作要保存:

public static boolean searchSpeno(String task){ 
    String query =task; 
    ResultSet rs = DBOptions.executeSQLQuery(query); 

    if(rs!=null) 
     { 
      try 
      { 
       java.sql.ResultSetMetaData rsmd = rs.getMetaData(); 
       int colCount = rsmd.getColumnCount(); 
       if(colCount > 0) 
       { 
        try 
        { 
         if(rs.next() && ! rs.getString("spe_number").equals("")) 
         { 
           return true; 
         } 
         else 
         { 
          return false; 
         } 

        } 

        catch(SQLException e) 
        { 
         JOptionPane.showMessageDialog(null, e,"Search Error", 3); 
         return false; 
        } 
       } 
       else 
       { 
        //JOptionPane.showMessageDialog(null, "Invalid Employee ID","Search Error", 3); 
        return false; 
       } 
      } 
      catch(SQLException ex) 
      { 
       //JOptionPane.showMessageDialog(null, ex.getMessage(),"Error Occured", 2); 
       return false; 
      } 

     } 
     else 
     { 
      return false; 
     } 

} 

}

}

private void printsavebtnActionPerformed(java.awt.event.ActionEvent evt) {            
    // TODO add your handling code here: 

    String query1= "insert into STCEPARTICIPANTS values(" 
       +speno1tf.getText()+",'"+sname1tf.getText()+"','" 
       +fname1tf.getText()+"','"+uni1cb.getSelectedItem() 
       +"')"; 
    String query2= "insert into STCEPARTICIPANTS values(" 
       +speno1tf.getText()+",'"+sname1tf.getText()+"','" 
       +fname1tf.getText()+"','"+uni1cb.getSelectedItem() 
       +"')"; 
    String query3= "insert into STCEPARTICIPANTS values(" 
       +speno1tf.getText()+",'"+sname1tf.getText()+"','" 
       +fname1tf.getText()+"','"+uni1cb.getSelectedItem() 
       +"')"; 
    String query4= "insert into STCEPARTICIPANTS values(" 
       +speno1tf.getText()+",'"+sname1tf.getText()+"','" 
       +fname1tf.getText()+"','"+uni1cb.getSelectedItem() 
       +"')"; 
    String [] queryarray= {query1,query2,query3,query4}; 

    int speno1,speno2,speno3,speno4; 
    String task; 
    if(fname1tf.getText().equals("")||sname1tf.getText().equals("")||speno1tf.getText().equals("") 
      ||uni1cb.getSelectedItem().equals("-")|| fname2tf.getText().equals("")||sname2tf.getText().equals("")||speno2tf.getText().equals("") 
      ||uni2cb.getSelectedItem().equals("-") || fname3tf.getText().equals("")||sname3tf.getText().equals("")||speno3tf.getText().equals("") 
      ||uni3cb.getSelectedItem().equals("-") || fname4tf.getText().equals("")||sname4tf.getText().equals("")||speno4tf.getText().equals("") 
      ||uni4cb.getSelectedItem().equals("-") ){ 
     JOptionPane.showMessageDialog(rootPane, "Please enter the fields marked '*'"); 
    } 
    else { 
     try{ 
     speno1=Integer.parseInt(speno1tf.getText()); 
     speno2=Integer.parseInt(speno2tf.getText()); 
     speno3=Integer.parseInt(speno3tf.getText()); 
     speno4=Integer.parseInt(speno4tf.getText()); 

     int [] taskit = {speno1,speno2,speno3,speno4}; 

     for(int count2=0;count2<taskit.length;count2++){ 
      task= "select * from STCEPARTICIPANTS where spe_number="+taskit[count2]; 
      DBOptions.executeNonQuery(queryarray[count2]); 

      if(SearchData.searchSpeno(task)==true){ 
     JOptionPane.showMessageDialog(rootPane, "Sorry, this member is already in the database./t Please go to Profile to renew of view membership details. Thank you!"); 
     } 
     } 

類SearchData在下面給出

班DBOptions是:

public static boolean executeNonQuery(String sqlString) 
{ 
    try 
    { 
     Statement stmt = con.createStatement(); 
     stmt.executeUpdate(sqlString); 
     JOptionPane.showMessageDialog(null,"success!"); 
     return true; 
     //return the number of rows affected 
    } 
    catch(SQLException e) 
    { 
     //display error message 
     JOptionPane.showMessageDialog(null, e.getMessage()+"\nPlease Try Again","Non Query Execution Failure", 1); 
     e.printStackTrace(); 
     return false; 
    } 
} 

public static ResultSet executeSQLQuery(String sqlQuery) 
{ 
    try 
    { 
     Statement stmt = con.createStatement(); 
     return stmt.executeQuery(sqlQuery); //query successfully executed 
    } 
    catch(SQLException e) 
    { 
     //display error message 
     JOptionPane.showMessageDialog(null, e.getMessage()+"\nPlease Try Again","Query Execution Failure", 1); 
     return null; //sql query execution failed 
    } 
} 

}

拜託,我已經看到了這樣的一些問題,我已經嘗試了不同形式的解決方案,但沒有頭路。我需要爲小型項目防禦做好準備。我感謝你的迴應。謝謝。

回答

0

您是如何創建表格的?你可以將CREATE TABLE語句粘貼到你的問題中嗎?

表中的每一行都必須爲每個列定義一個唯一的值,該列被定義爲PRIMARY KEY或UNIQUE,並且Derby正在執行該約束。

回到您的表定義,找出您在列上指定了PRIMARY KEY或UNIQUE的列,然後查看您的程序以確定您爲這些列提供的值。

然後修改您的程序,以便爲每個此類列提供唯一值。

+0

非常感謝布賴恩在這個問題上花了很長時間。我創建了這樣的表格: 創建表stceparticipants(spe_number整數不爲null主鍵,名字varchar(100)非空,姓氏varchar(100)非空,大學varchar(100)非空) ) 有沒有這樣的主鍵違規,因爲我沒有重複輸入的值... 請感謝您的關注。希望儘快獲得解決方案。謝謝! – Patrick 2013-02-20 03:58:54

+0

在粘貼到查詢中的程序代碼中,變量'query1','query2','query3'和'query4'看起來是相同的。也就是說,他們都使用'speno1tf.getText()'。這聽起來像他們都試圖爲'spe_number'列插入相同的值。 – 2013-02-20 05:10:54

+0

謝謝布萊恩。我糾正了它 – Patrick 2013-02-25 10:11:53