2013-04-30 6 views
1

Я хочу, чтобы получить только те данные, которые имеют тот же DATE_ADD и выводит его на table_patientsИзвлечение данных из базы данных с помощью JDateChooser?

Вот код

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

    java.util.Date chooser= choose.getDate(); 
    java.sql.Date sqlchooser=new java.sql.Date(chooser.getDate()); 

    try{ 
    String sql="select * from Patients_Details where Date_Add='"+sqlchooser+"'"; 
    pst=conn.prepareStatement(sql); 
    pst.setDate(1,sqlchooser); 
    rs=pst.executeQuery(); 
    table_patients.setModel(DbUtils.resultSetToTableModel(rs)); 

    } 
catch(SQLException sql) 
{ sql.printStackTrace(); } 
} 

, но я получаю эту ошибку

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 
at org.sqlite.PrepStmt.batch(PrepStmt.java:192) 
at org.sqlite.PrepStmt.setObject(PrepStmt.java:245) 
at org.sqlite.PrepStmt.setDate(PrepStmt.java:290) 
at employeeJFrame.btn_GoActionPerformed(employeeJFrame.java:981) 
at employeeJFrame.access$1300(employeeJFrame.java:18) 
at employeeJFrame$13.actionPerformed(employeeJFrame.java:391) 

ошибка указывает на этой линии

pst.setDate(1,sqlchooser); 

Может кто-нибудь угодить h ELP? NB: Я java begginer

+0

какой это язык? Ява? Javascript? пожалуйста, пометьте как таковой. Кроме того, проясните, в какой строке произошла ошибка. –

ответ

1

Здесь есть несколько проблем.

  1. Вы передаете день месяца конструктору, который ожидает значение времени в миллисекундах. Это приведет к тому, что ваш sqlchooser будет иметь от 1 до 31 миллисекунды после полуночи в 1970-01-01 годах. Если вы посмотрите на документацию, вы увидите, что java.util.Date.getDate()

    Возвращает день месяца, представленного этим Дата объекта ...

    и конструктор java.sql.Date(long)

    Конструкции объект Date с использованием заданного значения времени в миллисекундах ...

    Также следует учитывать, что t hat java.util.Date.getDate() устарел в пользу Calendar.get(Calendar.DAY_OF_MONTH).

  2. Вы задаете условие даты явно, построив строку SQL с помощью sqlchooser и затем пытаетесь установить дату как параметр подготовленного оператора (но оператор не имеет параметров). Вам нужно только сделать один из них. Читайте до Using Prepared Statements, чтобы понять, как работают параметры.

Первый выпуск, скорее всего, приведет к получению результатов. Второй вопрос должен быть вызван SQLException. Ни один из них не должен вызывать никаких проблем на указанной вами линии, но я предлагаю исправить эти проблемы и перейти оттуда.

Для работы с датами в будущем вам следует использовать Joda Time, а не базовый Java-интерфейс даты и времени, который многие считают плохо разработанным.

UPDATE (после предоставления деталей исключения)

Опубликуйте редактировать, то ясно, что вы получаете эту ошибку, потому что вы пытаетесь присвоить параметр, подготовленное заявление, что не имеет параметров (пункт 2 выше). Параметры представлены символом '?' символ в операторах. Подробнее см. Связанную документацию.

Если вы посмотрите на исключение, вы увидите, что оно встречается в методе org.sqlite.PrepStmt.batch.Источник этого метода является:

private void batch(int pos, Object value) throws SQLException { 
    checkOpen(); 
    if (batch == null) batch = new Object[paramCount]; 
    batch[batchPos + pos - 1] = value; 
} 

Для вашего заявления, paramCount==0, поэтому массив партии Object создается с длиной 0. В последней строке затем пытается установить первый элемент (0 + 1 - 1 = 0) на ваш пройденный Date объект, поэтому вы получаете ArrayIndexOutOfBoundsException.

Итог: Прочитайте и поймите о подготовленных параметрах оператора по предоставленной ссылке.

Смежные вопросы