我的问题是我无法获取两个日期之间的所有记录。
我有两个JDateChooser
个。当我选择两个日期,如'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);
}
}
谁能告诉我我的错误在哪里? 提前谢谢..
答案 0 :(得分: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();
答案 1 :(得分: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
&amp; jd1
没有被追加。此更改现在将其附加到查询中。问题在于jd & jd1
未正确附加在查询中。
注意: - 我添加了SDF,以便您可以格式化所需格式的日期并将其附加到查询中。
答案 2 :(得分: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);
答案 3 :(得分:2)
永远不会在艰难且长期运行的GUI Objects
内部,也不会在JDBC
- try
- catch
内部创建finally
。永远不会被创造
DefaultListModel listModel = new DefaultListModel();
应该创建一个局部变量,然后不需要在运行时重新创建新的XxxListModel
必须从listModel
删除所有元素,否则新Items
将附加到JList
String [] data;
的定义以及data = new String[100];
内的data [i] = rs.getString("date");
和while(rs.next()) {
都是无用的,因为数据库记录是从XxxListModel
中的此数组存储的,并可供其他地方使用
Connection
,PreparedStatement
和ResultSet
应在finally block
try
- catch
- finally
中关闭),其他Objects
在JVM
记忆中保持(并且增加),
答案 4 :(得分:1)
你确定SQL中的日期和java.util.Date中的日期格式相同吗?
尝试使用
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(todaysDate);
检查它们是否相同。
默认情况下,jd和jd1因SQL日期@see SQL Dates
而不同答案 5 :(得分:1)
这不是使用已准备好处理日期的PreparedStatement
的正确方法,因此不应将它们转换为字符串。您的代码应如下所示:
PreparedStatement pstmt = ...
pstmt.setDate(...)
你的查询字符串并没有真正使用jd作为变量,你误用'和'