2012-01-17 31 views
1

私のAccessDBでテーブルを更新しようとしていますが、私は奇妙な問題があります。 例外はスローせずに更新が実行されますが、日付値が正しくなく、レコードが更新されるたびに が更新されるたびに、値は常に「30/12/1899」に変わります。 新しいレコードを挿入しようとしているときに同じことが起こります。AccessデータベースにJavaの日付を挿入 - 奇妙な問題

私のDBでは、日付フィールドはShortDate形式です。ここで

は私のコードの例です:

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"); 
    } 
    } 

間違って何が起こっているかを把握するために、私はボタンを作って、押されたとき、私は にdf.formatの結果を示すメッセージを持っていた(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に置き換えるのは気になりません。 DBから日付を取得するためにselectを使用すると、すべてうまく行きます。 この問題は、更新/挿入時にのみ発生します。

答えて

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(); 

あなたがそれらの1つ、例えばにあなたの日付選択によって返される日付タイプを変換する必要があるかもしれないので、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()); –