2015-05-08 105 views
1

更新我的MS Access數據庫我有這樣的代碼使用ucanaccess更新我的MS Access數據庫。我的代碼的作品發現,如果我更新我的數據庫的第一行,但問題是,如果我更新第二行直到最後一行此錯誤出現。使用ucanaccess連接

「net.ucanaccess.jdbc.UcanaccessSQLException:完整性約束衝突:唯一約束或索引違反; SYS_PK_10339表:EMPLOYEETABLE2」

我懷疑我在做我的MS錯誤訪問設置,我的主鍵是員工姓名及其數據類型是文本。

public void actionPerformed(ActionEvent e) 
    {      

         String employeeName = endrollNameFields.getText(); 
         String employeeAddress = endrollAddressFields.getText(); 
         String employeeStatus = endrollEmployeestatusFields.getText(); 
         String employeeDateOfMembership = dateOfMembershipFields.getText(); 
         String employeeAge = ageFields.getText(); 
         String employeMStatus = maritalstatusFields.getText(); 
         String employeeBloodType = bloodTypeFields.getText();        
         String employeeGender = genderFields.getText(); 
         String beginningCapital = beginningCapitalFields.getText(); 
         String grossSalary = grossSalaryFields.getText(); 
         String salaryDeductions = salaryDeductionFields.getText(); 
         String netSalary = netSalaryFields.getText(); 

         try 
         { 
          //------------CREATE CONNECTION TO DATA BASE--------------/ 

          String DBPAD = "sourceFolder/employeeTable2.mdb"; 
          String DB = "jdbc:ucanaccess://" + DBPAD;       

          con = DriverManager.getConnection(DB);     
          st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
          String sql = "Select * FROM employeeTable2"; 

          rs = st.executeQuery(sql); 

          if (rs != null) 
           while (rs.next()) 
           { 
            rs.updateString("Employee Name", employeeName); 
            rs.updateString("Employee Age", employeeAge); 
            rs.updateString("Employee Address", employeeAddress); 
            rs.updateString("Employee Marital Status", employeMStatus); 
            rs.updateString("Employee Date of Membership", employeeDateOfMembership); 
            rs.updateString("Employee Blood Type", employeeBloodType); 
            rs.updateString("Employee Status", employeeStatus);         
            rs.updateString("Employee Gender", employeeGender); 
            rs.updateString("Beginning Capital", beginningCapital); 
            rs.updateString("Gross Salary", grossSalary); 
            rs.updateString("Salary Deductions", salaryDeductions); 
            rs.updateString("Net Salary", netSalary);       

            rs.updateRow(); 
           }         

          st.close();  


          st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
          String sql1 = "select * from employeeTable2"; 
          rs = st.executeQuery(sql1); 

          JOptionPane.showMessageDialog(null, "<html>" + "<font color=\"#008000\">" + "<html><span style='font-size:1.5em'>Update to Data Base is Successful"); 

          endrollNameFields.setText(" "); 
          endrollAddressFields.setText(" "); 
          endrollEmployeestatusFields.setText(" "); 
          dateOfMembershipFields.setText(" "); 
          ageFields.setText(" "); 
          maritalstatusFields.setText(" "); 
          genderFields.setText(" ");        
          bloodTypeFields.setText(" "); 
          beginningCapitalFields.setText(" "); 
          grossSalaryFields.setText(" "); 
          salaryDeductionFields.setText(" "); 
          netSalaryFields.setText(" ");       

         } 
         catch(Exception e1) 
         { 
          JOptionPane.showMessageDialog(null, e1); 
         }    
        }  

       }); 
+0

你試圖修改主鍵列「Employee Name」,這會導致重複。這是因爲你選擇了'employeeTable2'中的所有行並試圖將它們全部更新爲相同的值 – MadProgrammer

+0

與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」或簽名在[so]上。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed - 從 - 個)。 –

+0

歐凱先生得到了它。 –

回答

0

您試圖修改導致重複的主鍵列Employee Name。這是由以下事實引起你是從employeeTable2選擇所有的行,並試圖將它們全部更新爲相同的值

要插入一個新值,您可以使用INSERT語句,像...

String employeeName = endrollNameFields.getText(); 
String employeeAddress = endrollAddressFields.getText(); 
String employeeStatus = endrollEmployeestatusFields.getText(); 
String employeeDateOfMembership = dateOfMembershipFields.getText(); 
String employeeAge = ageFields.getText(); 
String employeMStatus = maritalstatusFields.getText(); 
String employeeBloodType = bloodTypeFields.getText(); 
String employeeGender = genderFields.getText(); 
String beginningCapital = beginningCapitalFields.getText(); 
String grossSalary = grossSalaryFields.getText(); 
String salaryDeductions = salaryDeductionFields.getText(); 
String netSalary = netSalaryFields.getText(); 

String DBPAD = "sourceFolder/employeeTable2.mdb"; 
String DB = "jdbc:ucanaccess://" + DBPAD; 

try (Connection con = DriverManager.getConnection(DB)) { 
    try (PreparedStatement stmt = con.prepareStatement("insert into employeeTable2 (" 
        + "'Employee Name', " 
        + "'Employee Age', " 
        + "'Employee Address', " 
        + "'Employee Marital Status', " 
        + "'Employee Date of Membership', " 
        + "'Employee Blood Type'" 
        + "'Employee Status'," 
        + "'Employee Gender'," 
        + "'Beginning Capital'," 
        + "'Gross Salary'," 
        + "'Salary Deductions'," 
        + "'Net Salary') values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) { 

     stmt.setString(1, employeeName); 
     stmt.setString(2, employeeAge); 
     stmt.setString(3, employeeAddress); 
     stmt.setString(4, employeMStatus); 
     stmt.setString(5, employeeDateOfMembership); 
     stmt.setString(6, employeeBloodType); 
     stmt.setString(7, employeeStatus); 
     stmt.setString(8, employeeGender); 
     stmt.setString(9, beginningCapital); 
     stmt.setString(10, grossSalary); 
     stmt.setString(11, salaryDeductions); 
     stmt.setString(12, netSalary); 

     JOptionPane.showMessageDialog(null, "<html>" + "<font color=\"#008000\">" + "<html><span style='font-size:1.5em'>Update to Data Base is Successful"); 

     endrollNameFields.setText(" "); 
     endrollAddressFields.setText(" "); 
     endrollEmployeestatusFields.setText(" "); 
     dateOfMembershipFields.setText(" "); 
     ageFields.setText(" "); 
     maritalstatusFields.setText(" "); 
     genderFields.setText(" "); 
     bloodTypeFields.setText(" "); 
     beginningCapitalFields.setText(" "); 
     grossSalaryFields.setText(" "); 
     salaryDeductionFields.setText(" "); 
     netSalaryFields.setText(" "); 

    } 

} catch (Exception e1) { 
    JOptionPane.showMessageDialog(null, e1); 
} 

現在,如果要更新現有的行,你可以簡單地使用UPDATE聲明,或使用當前的編碼風格,選擇相匹配的僱員的姓名的行和更新這一行,但是,這種假設名字沒有改變...

String employeeName = endrollNameFields.getText(); 
String employeeAddress = endrollAddressFields.getText(); 
String employeeStatus = endrollEmployeestatusFields.getText(); 
String employeeDateOfMembership = dateOfMembershipFields.getText(); 
String employeeAge = ageFields.getText(); 
String employeMStatus = maritalstatusFields.getText(); 
String employeeBloodType = bloodTypeFields.getText(); 
String employeeGender = genderFields.getText(); 
String beginningCapital = beginningCapitalFields.getText(); 
String grossSalary = grossSalaryFields.getText(); 
String salaryDeductions = salaryDeductionFields.getText(); 
String netSalary = netSalaryFields.getText(); 

String DBPAD = "sourceFolder/employeeTable2.mdb"; 
String DB = "jdbc:ucanaccess://" + DBPAD; 

try (Connection con = DriverManager.getConnection(DB)) { 
    try (PreparedStatement stmt = con.prepareStatement("Select * FROM employeeTable2 where 'Employee Nam' == ?", 
        ResultSet.TYPE_SCROLL_INSENSITIVE, 
        ResultSet.CONCUR_UPDATABLE)) { 

     stmt.setString(1, employeeName); 

     try (ResultSet rs = stmt.executeQuery()) { 

      if (rs.next()) { 

       rs.updateString("Employee Name", employeeName); 
       rs.updateString("Employee Age", employeeAge); 
       rs.updateString("Employee Address", employeeAddress); 
       rs.updateString("Employee Marital Status", employeMStatus); 
       rs.updateString("Employee Date of Membership", employeeDateOfMembership); 
       rs.updateString("Employee Blood Type", employeeBloodType); 
       rs.updateString("Employee Status", employeeStatus); 
       rs.updateString("Employee Gender", employeeGender); 
       rs.updateString("Beginning Capital", beginningCapital); 
       rs.updateString("Gross Salary", grossSalary); 
       rs.updateString("Salary Deductions", salaryDeductions); 
       rs.updateString("Net Salary", netSalary); 
       rs.updateRow(); 

       JOptionPane.showMessageDialog(null, "<html>" + "<font color=\"#008000\">" + "<html><span style='font-size:1.5em'>Update to Data Base is Successful"); 

       endrollNameFields.setText(" "); 
       endrollAddressFields.setText(" "); 
       endrollEmployeestatusFields.setText(" "); 
       dateOfMembershipFields.setText(" "); 
       ageFields.setText(" "); 
       maritalstatusFields.setText(" "); 
       genderFields.setText(" "); 
       bloodTypeFields.setText(" "); 
       beginningCapitalFields.setText(" "); 
       grossSalaryFields.setText(" "); 
       salaryDeductionFields.setText(" "); 
       netSalaryFields.setText(" "); 

      } else { 
       // No matching row, maybe do a insert insetad 
      } 

     } 

    } 

} catch (SQLException e1) { 
    JOptionPane.showMessageDialog(null, e1); 
} 

另一種方法可能會維持到這是用來加載數據,並簡單地用新的數據更新「當前」行原ResultSet的參考,但你必須要小心,以確保光標位置沒不會換成新的一排。否則,您應該保留行的原始密鑰(Employee Name)的副本,並使用它來從數據庫中選擇要執行更新時的數據...

個人而言,我認爲UPDATE聲明是簡單...

你也應該採取更多的照顧你的資源,如果在你的代碼中出現異常,它不可能關閉優秀的,開放的資源。

看看The try-with-resources Statement一些更多的細節

(PS它一直以來我所做的針對MS Access數據庫的任何工作了很長時間,所以我可能已經拿到了列引用錯誤)

+0

一件事我JRE圖書館JRE1.8.0_40我的事上面的代碼與JRE庫1.7兼容。 –

+0

@MiguelJames我只是不認爲OP知道如何正確管理他們的資源;) – MadProgrammer