2017-05-23 4 views
1

MySQLデータベースにデータを挿入しようとすると問題が発生します。私はそれがJDateChooserのために起こったと思います。MySQLにJDateChooseを挿入

これは私が取得していますエラーです:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'May 24 21:06:17 CEST 2017, Fri May 26 00:00:00 CEST 2017, Desayuno, Adrian Poved' at line 1 

そして、これは、データを挿入する方法であるが:

public void nuevaReserva(ReservaVO reserva){ 
      try { 
       Statement st = bd.getConexion().createStatement(); 
       st.executeUpdate("INSERT INTO reserva VALUES(null,"+reserva.getInicio()+", "+reserva.getFin() 
       +", "+reserva.getRegimen()+", "+reserva.getCod_cliente()+", "+reserva.getCod_usuario() 
       +", "+reserva.getCod_habitacion()+");"); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

私もデータを得るために、私のcontrolerでこのメソッドを持っていますJDateChooserとComboBoxから:

private void insertaReserva() { 
     ReservaDAO modeloReserva = new ReservaDAO(); 
     String refEmpeladoS = String.valueOf(refEmpleado); 
     ReservaVO reserva = new ReservaVO("",nrv.getDateChooserLlegada().getDate().toString(), 
       nrv.getDateChooserSalida().getDate().toString(), 
       nrv.getListaPension().getSelectedItem().toString(), 
       nrv.getListaClientes().getSelectedItem().toString(),refEmpleadoS, 
       nrv.getListaHabitaciones().getSelectedItem().toString()); 

     modeloReserva.nuevaReserva(reserva); 
     } 

ありがとうございます。

+0

まだ修正できましたか? – Jan

+0

はい、ありがとうございます。 –

+0

その場合、問題を解決するのに役立つ回答をアップアップしたり受け入れたりして、うれしく思います。次回は問題がありましたら、ここで解決策を見つけることができます。 Stackoverflowへようこそ! – Jan

答えて

0

日付を文字列にフォーマットするには、SimpleDateFormat.format()メソッドを使用する必要があります。 nrv.getDateChooserSalida()。getDate()。toString()を使用するだけでデータオブジェクトを取得することはできません。

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd"); 
String dateFormatted = sdf.format(nrv.getDateChooserSalida().getDate().toString()); 

ReservaVOコンストラクタでDateFormattedを使用します。

+0

値が引用符で正しく囲まれていないという事実には役に立たないでしょうか? – Jan

+0

はい、そうでなければなりません st.executeUpdate( "INSERT INTO reserva VALUES(null、 '" + reserva.getInicio()+ "'、+ reserva.getFin() +" '、' "+ reserva.getRegimen "+" Reserva.getCod_habitacion()+ "');"); "+" Reserva.getCod_cliente()+ "'、 '" + reserva.getCod_usuario() –

+0

を追加することなく、これはほとんどすべての文字列のために破損します - または悪い(reserva.getInicio()と考える); DROP DATABASE "... – Jan

0

ほとんどの場合、あなたの日付価値の周りに引用符がありません。

しかし、それだけであなたを得ることができます。

改善するためのいくつかの点:

a)の使用のPreparedStatement /バインド変数

主にこれはあなたのデータベースに厄介なSQLインジェクションを防ぐ -

public void nuevaReserva(ReservaVO reserva){ 
     try { 
      PreparedStatement st = bd.getConexion().prepareStatement(
    "INSERT INTO reserva VALUES(null, ?, ?, ?, ?, ?, ?)"); 
      st.setString(1, reserva.getInicio()); 
      st.setString(2, reserva.getFin()); 
      st.setString(3, reserva.getRegimen()); 
      st.setString(4, reserva.getCod_cliente()); 
      st.setString(5, reserva.getCod_usuario()); 
      st.setString(6, reserva.getCod_habitacion()); 
      st.executeUpdate(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
を、読みSQLが少し良くなり、同様

覚えておいてください:あなたのカラム定義についてはわかりません。いくつかのsetInt()があるかもしれませんし、そうでなければあなたのニーズにはるかに良いかもしれません。

B)のtry-とリソース

閉じられることはありませんあなたのDatabaseconnection bd.getConnexion()

を使用することによって改善します。それは望んでいるかもしれませんが(1つの接続は長い時間開いています)、あなたのgetConexion()がデータベースへの接続を開くか(その場合は閉じる必要があります)、接続プール - この場合、あなたはそれを返す必要があります。両方とも、リソースを試してみると簡単に実行できます:

public void nuevaReserva(ReservaVO reserva){ 
     try (Connection con = bd.getConexion(); 
      PreparedStatement st = bd.getConexion().prepareStatement(
    "INSERT INTO reserva VALUES(null, ?, ?, ?, ?, ?, ?)")) { 
      st.setString(1, reserva.getInicio()); 
      st.setString(2, reserva.getFin()); 
      st.setString(3, reserva.getRegimen()); 
      st.setString(4, reserva.getCod_cliente()); 
      st.setString(5, reserva.getCod_usuario()); 
      st.setString(6, reserva.getCod_habitacion()); 
      st.executeUpdate(); 
     //Both statement and connection will be closed and closing curly brace 
     // even in case of an Exception! 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }