2012-01-17 1 views
1

내 AccessDB에서 테이블을 업데이트하려고하는데 이상한 문제가 있습니다. 예외가 발생하지 않고 업데이트가 실행되지만 날짜 값이 잘못되어 레코드를 업데이트 할 때마다 값이 항상 "30/12/1899"로 변경됩니다. 새 레코드를 삽입하려고 할 때 동일한 문제가 발생합니다.Access 데이터베이스에서 Java로 날짜 삽입 - 이상한 문제

내 DB에 날짜 필드는 ShortDate 형식입니다. 여기

내 코드의 예입니다, 나는 버튼을 만들어 누를 때 나는 df.format의 결과를 나타내는 메시지가 있었다
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); 

    if (jList1.isSelectionEmpty()) { 
     JOptionPane.showMessageDialog(null, "You have not selected any computer!"); 
    } else { 
     try { 
     String sql = "Update SYSTEMS set " 
      + " CPU='" + cpuTextField.getText().trim() 
      + "', MOBO='" + moboTextField.getText().trim() 
      + "', RAM='" + ramTextField.getText().trim() 
      + "', GPU='" + gpuTextField.getText().trim() 
      + "', HDD='" + hddTextField.getText().trim() 
      + "', PSU='" + psuTextField.getText().trim() 
      + "', MONITOR='" + monitorTextField.getText().trim() 
      + "', KEYBOARD='" + keyboardTextField.getText().trim() 
      + "', MOUSE='" + mouseTextField.getText().trim() 
      + "', OS='" + osTextField.getText().trim() 
      + "', SOFTWARE='" + othersTextArea.getText().trim() 
      + "', PURCHASE_DATE=" + df.format(jDateChooser1.getDate()) 
      + " where SYSTEM_ID='" + jList1.getSelectedValue().toString() + "'"; 

     st = con.prepareStatement(sql); 
     st.executeUpdate(); 

     } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
     } 
     JOptionPane.showMessageDialog(null, "Updated"); 
    } 
    } 

잘못 무슨 일이 일어나고 있는지 파악하기 위해서

(jDateChooser1 .getDate()) 및 에 정확한 날짜가 표시되었습니다.
private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {           
    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); 
    JOptionPane.showMessageDialog(null, df.format(jDateChooser1.getDate())); 
} 

나는 날짜를 얻을이 구성 요소를 사용하고 있습니다 : JCalendar을 그 어떤 차이가있는 경우. 날짜를 올바르게 가져 오면 평범한 TextField로 바꾸지 않아도됩니다. select를 사용하여 DB에서 날짜를 검색 할 때 모든 것이 잘됩니다. 이 문제는 업데이트/삽입 할 때만 발생합니다.

답변

0

액세스하려면 # MM/dd/yyyy # (해시 표시 포함) 형식으로 지정된 날짜가 필요합니다. 따라서 날짜 문자열의 시작과 끝에 # 구분 기호를 추가하면 제대로 작동합니다. 데이터가 제안한 것처럼 PreparedStatement를 사용하는 것이 가장 좋습니다. JDBC 드라이브가 Java Date를 Access 형식으로 변환하는 처리를하기 때문에 값을 형식화 할 필요가 없습니다.

+0

문제가 해결되었습니다. 감사! 그것은 매력처럼 작동했습니다. –

2

문제는 SQL 쿼리의 형식과 관련이 있습니다. 수동으로 서식을 지정하는 대신 PreparedStatement을 사용하십시오. 이렇게하면 SQL injection과 같은 보안 문제를 비롯하여 사용자 입력의 유효성 확인과 관련된 오류 가능성도 줄어 듭니다. 예를 들면 :

String sql = "Update SYSTEMS set " 
    + " CPU=?, MOBO=?, RAM=?" 
    + //... 
    + ", PURCHASE_DATE=?" 
    + " where SYSTEM_ID=?"; 
PreparedStatement stmt = con.prepareStatement(sql); 
int nextField = 1; 
stmt.setString(nextField++, cpuTextField.getText().trim()); 
stmt.setString(nextField++, moboTextField.getText().trim()); 
stmt.setString(nextField++, ramTextField.getText().trim()); 
// ... 
stmt.setDate(nextField++, jDateChooser1.getDate()); 
stmt.setString(nextField++, jList1.getSelectedValue().toString()); 
stmt.executeUpdate(); 

[편집] 당신이 그 중 하나에 당신의 날짜 선택기에 의해 반환되는 날짜 형식을 변환해야 할 수 있도록 PreparedStatement#setDate() 방법은하는 java.sql.Date 필요로 주, 예를 들면 :

stmt.setDate(nextField++, 
    new java.sql.Date(jDateChooser1.getDate().getTime())); 
+0

나는 어떻게하는지 모른다. 당신은 내보기 또는 읽을 링크를 줄 수 있습니까? –

+0

고마워, 나는 그것을 시험해보고 나는 다시 게시 할 것이다. –

+0

오류가 발생했습니다 : setDate (int, java.util.Date)에 적합한 메소드가 없습니다. stmt.setDate (nextField ++, jDateChooser1.getDate()); –

관련 문제