0

我的问题是我无法获取两个日期之间的所有记录。

我有两个JDateChoosers。当我选择两个日期(例如 '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);
    }        
}

谁能告诉我我的错误在哪里?提前致谢..

4

6 回答 6

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();
于 2013-04-23T09:34:35.717 回答
2
  1. 永远不要创建一个GUI Objects内部硬和长时间运行JDBC,也不要在内部try- catch- finally,除非那些对象永远不会被创建

  2. DefaultListModel listModel = new DefaultListModel();应该创建一个局部变量,然后不需要XxxListModel在运行时重新创建一个新的

  3. 必须从 中删除所有元素listModel,否则 newItems将附加到末尾JList

  4. String [] data;anddata = new String[100];data [i] = rs.getString("date");inside的定义while(rs.next()) {是非常无用的,因为数据库记录是从这个数组中存储的XxxListModel,并且可以在其他地方访问以供其他用途使用

  5. ConnectionPreparedStatement并且ResultSet应该在finally blocktry- catch- finally)中关闭,否则这些会在内存中Objects停留(并增加) ,JVM

于 2013-04-23T09:52:57.400 回答
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 + "'");

以前,在您的查询中,两个参数jd&jd1没有被追加。此更改现在会将其附加到查询中。问题在于jd & jd1未正确附加到查询中。

注意:-我添加了一个 SDF,以便您可以将日期格式化为所需的格式并将其附加到查询中。

于 2013-04-23T09:35:56.183 回答
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);
于 2013-04-23T09:35:59.177 回答
1

您确定 SQL 中的日期和 java.util.Date 中的日期格式相同吗?

尝试使用

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

检查它们是否相同。

默认情况下,jd 和 jd1 会因 SQL 日期而异@see SQL Dates

于 2013-04-23T09:38:45.387 回答
1

这不是正确的使用方式PreparedStatement,它已经准备好处理日期,所以你不应该将它们转换为 String。您的代码应如下所示:

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

此外,您的查询字符串并没有真正使用 jd 作为变量,您误用了 ' 和 "

于 2013-04-23T09:40:45.493 回答