2013-04-23 1 views
1

Моя проблема в том, что я не могу получить все записи, находящиеся между двумя датами.Невозможно получить записи между двумя датами

У меня есть два JDateChooser s. Когда я выбираю две даты типа '10 -apr-2011 'до '20 -apr-2011', я хочу, чтобы все записи между этими датами отображались в моем JList. Но я не могу получить никаких результатов в JList.

Я использую базу данных mysql.

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

    try 
    { 

     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con= 
      (Connection)DriverManager.getConnection(
      "jdbc:mysql://localhost:3306/test","root","ubuntu123"); 
     java.util.Date jd = jDateChooser1.getDate(); 
     java.util.Date jd1 = jDateChooser2.getDate(); 

     // PreparedStatement stmt = (PreparedStatement) con.prepareStatement("select date from invoice where date = ?); 

     // PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date BETWEEN ' ' AND ' '"); 

     PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date >= '+jd + ' AND date <= '+jd1 + '"); 

     pstmt.execute(); 

     ResultSet rs = pstmt.getResultSet(); 

     int i =0; 
     DefaultListModel listModel = new DefaultListModel(); 

     while(rs.next()) 
     { 

      String [] data; 
      data = new String[100]; 
      data [i] = rs.getString("date"); 
      jList1.setModel(listModel); 
      listModel.addElement(data [i]); 
      i = i+1; 

     } 
    } 
    catch (Exception e) 
    { 
     System.out.println("2nd catch " + e); 
    }   
} 

Может ли кто-нибудь сказать мне, где моя ошибка? Заранее спасибо ..

+1

Вы получаете какое-либо значение в результирующем? – Apurv

+2

no Resultset также пуст..и думаю, мой запрос застрял меня –

+0

Пожалуйста, поделитесь значением 'jd' и' jd1' – Apurv

ответ

3

Поскольку это PreparedStatement вы можете попробовать:

PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date >= ? AND date <= ?"); 
pstmt.setDate(1,new java.sql.Date(jd.getTime())); 
pstmt.setDate(2,new java.sql.Date(jd1.getTime())); 
ResultSet rs = pstmt.executeQuery(); 
+2

Не найдено подходящего метода для setDate (int, java.util.Date) метод com.mysql.jdbc.PreparedStatement.setDate (int, java.sql .Date, java.util.Calendar) не применимо (фактические и формальные списки аргументов различаются по длине) метод com.mysql.jdbc.PreparedStatement.setDate (int, java.sql.Date) не применимо (фактический аргумент java.util.Date не может быть преобразован в java.sql.Date путем преобразования вызова метода) Эта ошибка возникает –

+0

@kapil См. мой обновленный ответ. Проблема заключалась в том, что setDate нуждается в java.sql.Date – dan

+2

Да, это работает .. Большое спасибо приятелю .. :) –

2

Вы должны изменить свой запрос. Что-то вроде этого: -

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
String jdStr = sdf.format(jd); 
String jd1Str = sdf.format(jd1); 
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date >= '" + jdStr + "' AND date <= '" + jd1Str + "'"); 

Ранее в запросе, в 2 параметра, jd & jd1 были не получать Append. Это изменение теперь добавит его в запрос. Проблема заключалась в том, что jd & jd1 неправильно добавлен в запрос.

Примечание: - Я добавил SDF, чтобы вы могли форматировать дату в нужном формате и добавить ее в запрос.

+0

Это выглядит правильно. – Apurv

+2

Нет таким образом, JList показывает все записи, а не только те, которые находятся между двумя датами .. –

+1

Тогда убедитесь, что ваши даты правильные! Я не вижу никакой другой проблемы, почему она должна получить все! – SudoRahul

2

Вы должны вынуть jList1.setModel(listModel); из петли

while(rs.next()) 
    { 

     String [] data; 
     data = new String[100]; 
     data [i] = rs.getString("date"); 
     //jList1.setModel(listModel); 
     listModel.addElement(data [i]); 
     i = i+1; 

     } 

jList1.setModel(listModel); 
+2

все еще ничего не отображается в JList .. –

+1

Следуйте инструкциям, указанным в ответе RJ, а затем я удаляю инструкцию 'setModel' из цикла – Apurv

1

вы уверены, что даты в SQL и даты от java.util.Date находятся в том же формате?

Попробуйте использовать

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
String formattedDate = formatter.format(todaysDate); 

, чтобы проверить, когда они совпадают.

и JD1 юлианского день по умолчанию будут отличаться по дате SQL @see SQL Dates

+2

. Да, конечно, его одинаковый формат. –

1

Это не правильный способ использования PreparedStatement, который уже готов для обработки дат, так что вы не должны тайных их в строку.Ваш код должен выглядеть следующим образом:

PreparedStatement pstmt = ... 
pstmt.setDate(...) 

Кроме того, ваша строка запроса на самом деле не используя иорданских в качестве переменной, вы неправильно "и"

+2

Спасибо, ребята, за помощь, но у меня есть трюк @ dan –

2
  1. никогда не создать GUI Objects внутри жесткий и долго работает JDBC, ни внутри try - catch - finally, на исключении не будут созданы те объекты

  2. DefaultListModel listModel = new DefaultListModel(); должна быть создана локальная переменная, а затем не требуется, чтобы воссоздать новый XxxListModel во время выполнения

  3. должны удалить все элементы из listModel, в противном случае новый Items будет добавлен к концу JList

  4. определение String [] data; и data = new String[100]; и data [i] = rs.getString("date"); внутри while(rs.next()) { совершенно бесполезны, так как запись базы данных хранятся из этого массива в XxxListModel, и доступное для другого использования для других стран

  5. Connection, PreparedStatement и ResultSet должны быть закрыты в finally block (try - catch - finally), otheriwe этого Objects остается (и увеличение) в JVM памяти,

+2

Спасибо будет работать на этом .. @ mKorbel –