使用JDateChooser从数据库中检索数据?

时间:2013-04-30 09:43:36

标签: java database sqlite jdatechooser

我想只检索具有相同date_Add的数据并将其输出到table_patients

这是代码

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

有人可以帮忙吗? NB:我是一个java begginer

1 个答案:

答案 0 :(得分:1)

这里有很多问题。

  1. 您将月份的日期传递给期望毫秒时间值的构造函数。这将导致您的sqlchooser日期在1970-01-01午夜后的1到31毫秒之内。如果您查看文档,您会看到java.util.Date.getDate()

      

    返回此Date对象所代表的月份日期...

    构造函数java.sql.Date(long)

      

    使用给定的毫秒时间值...

    构造Date对象

    另请注意,java.util.Date.getDate()已被弃用,而不是Calendar.get(Calendar.DAY_OF_MONTH)

  2. 您通过使用sqlchooser构造SQL字符串来显式设置日期条件,然后尝试将日期设置为预准备语句的参数(但该语句没有参数)。你只需要做其中一个。请阅读Using Prepared Statements以了解参数的工作原理。

  3. 第一个问题可能会导致您没有收到任何结果。第二个问题应该是SQLException。这些都不会导致你指出的问题,但我建议修复这些问题并从那里继续前进。

    对于未来日期的工作,您应该考虑使用Joda Time而不是基本的Java日期/时间API,许多人认为它设计得很差。

    更新(提供例外详细信息)

    发布您的编辑,很明显您收到此错误,因为您正在尝试将参数分配给没有参数的预准备语句(上面的第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的原因。

    底线:在提供的链接上阅读并了解有关预准备语句参数的信息。