2016-04-05 5 views
0

В программе я написал чеки на номера, доступные в отеле. Я использовал JCalendar для ввода пользователем дат и JTable для отображения доступных номеров. Проблема в том, что когда я нажимаю кнопку «Проверить доступность», она бросает SQL Exception.Доступность контрольной комнаты с использованием JTable и JCalendar выбрасывает исключение SQL

Вот фрагменты кода:

public class Room_Availability extends JFrame { 

//Note: Didn't add codes about instantiating panels, setting layouts and all 

JLabel arr_date= new JLabel("Arrival Date:"); 
JLabel dep_date= new JLabel("Departure Date:"); 
JButton chk_btn= new JButton("Check Availability"); 
JDateChooser arrival = new JDateChooser(); 
JDateChooser departure = new JDateChooser(); 
JTable CheckAvail= new JTable(); 

Room_Availability(){ 

chk_btn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      CheckAvailActionPerformed(evt); 
     } 
    }); 

    } 


private void CheckAvailActionPerformed(java.awt.event.ActionEvent evt) {            


    ResultSet rs = null; 
    Connection conn = null; 
    Statement stmt = null; 
    try { 
     // new com.mysql.jdbc.Driver(); 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     String connectionUrl = "jdbc:mysql://localhost:3306/testing?autoReconnect=true&useSSL=false"; 
     String connectionUser = "root"; 
     String connectionPassword = "admin"; 
     conn = DriverManager.getConnection(connectionUrl, connectionUser, 
       connectionPassword); 
     stmt = conn.createStatement(); 

     String query= "select * from room as ro" + 
       "where ro.room_id not in "+ 
       " ("+ 
        "select re.room_no"+ 
        " from testing.booking as re "+ 
        "where (arrival_date >= ? and departure_date < ?)"+ 
        "or (departure_date >= ? and arrival_date < ?)"+ 
       ")"; 

     PreparedStatement pStmt = (PreparedStatement) conn.prepareStatement(query); 

     java.util.Date utilDate = arrival.getDate(); 
     java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 

     java.util.Date utilDate1 = departure.getDate(); 
     java.sql.Date sqlDate1 = new java.sql.Date(utilDate1.getTime()); 

     pStmt.setDate(1, sqlDate); 
     pStmt.setDate(2, sqlDate1); 
     pStmt.setDate(3, sqlDate); 
     pStmt.setDate(4, sqlDate1); 


     rs = pStmt.executeQuery(); 

     CheckAvail.setModel(DbUtils.resultSetToTableModel(rs)); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
    } 
} 

Вот как GUI выглядит следующим образом: enter image description here

Когда я выполнить запрос (с теми же датами, как я вхожу на JCalendar) на MySQL база данных это то, что отображается и должна отображаться на JTable: enter image description here

Вот ошибки я получаю:

enter image description here

+3

Есть 4 запроса n в вашем запросе, то есть для этого требуется 4 параметра; вы указываете только 2 параметра. –

+0

Я прокомментировал строку '' или (departure_date> =? И arrival_date Tia

ответ

2

Я думаю, вы должны установить параметр для каждого '?' в запросе. Есть четыре '?' заполнители, но Вы можете установить только два из них

pStmt.setDate(1, sqlDate); 
    pStmt.setDate(2, sqlDate1); 

Это должно быть что-то вроде этого

pStmt.setDate(1, sqlDate); 
pStmt.setDate(2, sqlDate1); 
pStmt.setDate(3, sqlDate1); 
pStmt.setDate(4, sqlDate); 
+0

Спасибо, я просто попробовал, но он бросил' MySQLSyntaxErrorException' – Tia

+0

@Diksha, вы можете редактировать ваш квест с кодом, который у вас есть после попытки исправить его на основе этого ответа? –

+0

@ LajosArpad Сделано! – Tia

1

Существует не хватает места в строках:

"where (arrival_date >= ? and departure_date < ?)"+ 
"select * from room as ro" + 

Просто добавьте один пробел в конце строка

"where (arrival_date >= ? and departure_date < ?) "+ 
"select * from room as ro " + 
+0

Он по-прежнему бросил' MySQLSyntaxErrorException' – Tia

+0

Я отредактировал свой ответ, есть еще одна строка без места, лучше проверьте их все –

+0

Спасибо большое! Это сработало! – Tia