我想只检索具有相同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
答案 0 :(得分: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)
。
您通过使用sqlchooser
构造SQL字符串来显式设置日期条件,然后尝试将日期设置为预准备语句的参数(但该语句没有参数)。你只需要做其中一个。请阅读Using Prepared Statements以了解参数的工作原理。
第一个问题可能会导致您没有收到任何结果。第二个问题应该是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
的原因。
底线:在提供的链接上阅读并了解有关预准备语句参数的信息。