【问题标题】:SQLException caught: Unknown column in 'where clause'捕获的 SQLException:“where 子句”中的未知列
【发布时间】:2014-04-19 10:20:42
【问题描述】:

我正在制作一个日历系统,我可以在其中选择两个日期,然后返回我在此期间工作了多少小时。下图是一天的。日历系统如下所示:

如您所见,我有一个开始日期和结束日期。我应该从 javascript 中获取值并发送到我的 servlet。

这里是 Javascript:

<script>

  $(function() {
        $(".datepicker" ).datepicker({dateFormat: 'yy-mm-dd'});
      });
  </script>

  </head>
<body>
    DatePicker Ajax Post:

    <form method="post" id="myForm" action="../getHoursSQL">
    Start Date:
        <input type="text" name="startDate" class="datepicker"/><br/>                     
    End Date:
        <input type="text" name="endDate" class="datepicker"/><br/>

        <input type="submit"/>
    </form>
    <div id="startresult"></div>
    <div id="endresult"></div>

</body>
<script type="text/javascript">

    $("input[name=endDate]").datepicker({
        dateFormat: 'yy-mm-dd',
        onSelect: function(date, instance){            
             var jsonStr = $('#myForm').serializeArray();
            console.log(JSON.stringify(jsonStr));
              $.ajax({
                  url: "../getHoursSQL",
                  type: "post",
                  data: JSON,
                  success: function(data){
                      start: $("#startDate").val();
                      alert("success");
                      $("#startresult").html(data);

                  },
                  error:function(){
                      alert("failure");
                      $("#startresult").html('there is error while submit');
                  }  
                });
        }
    });
</script>

我的 servlet 在这里:

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res) 
        throws ServletException, IOException{



        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;

        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", ""); 
            //Getting the data from database

            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + "WHERE startDate = ? AND endDate = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);

            SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd");

            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );  
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );

            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );      
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
                pst.setDate( 1, sql_StartDate );
                pst.setDate(2, sql_EndDate );
                System.out.println(req.getParameter("startDate"));                          
                System.out.println(req.getParameter("endDate"));
            //Show the result from database
                ResultSet rs = pst.executeQuery();

            float Allday_hours_sum = 0;
                while (rs.next()){                                      
                    Allday_hours_sum += rs.getFloat("Allday_hours"); 

                }   
                res.setContentType("text/html;charset=UTF-8");          
                res.getWriter().print(Allday_hours_sum); 

                pst.close();

        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}

所以问题是,当我运行我的页面时,我收到一个错误 SQLException 被捕获:'where 子句'中的未知列'startDate'。我的数据库如下所示:

          P_id   |     Date         |   Day_hours    |        Day_minutes   |     Allday_hours  
Job 1      1        2014-03-10              4                      45                 4.45
Job 2      2        2014-03-10              5                      15                 5.15
Job 3      3        2014-03-09              3                      30                 3.30
Job 4      4        2014-03-09              1                      45                 1.45

                                                                   Printet out:     **15.15**

这当然是因为我的数据库中没有任何“startDate”。但是如何进行以下 SQL 查询来获取日期?

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                        + "WHERE startDate = ? AND endDate = ? ";

当我点击“提交”时,我会在控制台中看到这个 printet:

2014-03-03 2014-03-21

SQLException caught: Unknown column 'startDate' in 'where clause'

【问题讨论】:

    标签: javascript mysql servlets datepicker


    【解决方案1】:

    您需要在WHERE关键字之前添加一个空格,如下所示,

    String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                        + " WHERE Date Between ? AND ? ";
    

    【讨论】:

    • 非常感谢您的评论。我仍然收到错误:2014-03-10 2014-03-26 SQLException 被捕获:'where 子句'中的未知列'startDate',因为我的 MySQL 中没有名为 startDate 的列
    • @Julie24 非常简单,只需删除 startDate to Date 和 endDate to Date 即可。请检查我的更新答案。
    • 太酷了,然后我只打印日期。另一个问题来了,但最重要的是这个。非常感谢 Kedarnath :-)
    • @Julie24:当必须使用where 子句检查单个列上的值时,AND 不会获取任何记录。这是错误的。
    【解决方案2】:

    正确答案是:

    String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                        + " WHERE Date = ? AND Date = ? ";
    

    【讨论】:

    • 没有。这是不正确的。它不会获取任何结果。检查我的答案。
    【解决方案3】:

    您的表没有名称为 startDateendDate 的列,但名称为 date
    因此引发了 SQL 异常。

    变化:

    String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours
                  FROM Workdata "
               + "WHERE startDate = ? AND endDate = ? ";
    

    收件人:

    String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours
                  FROM Workdata "
               + "WHERE Date = ? AND Date = ? ";
    

    当你只有Date 列时,你不能在where 子句中使用AND
    它永远不会发生。

    您必须在寻找 - 或between 子句。

    示例
    变化:

    WHERE Date = ? AND Date = ?  
    

    收件人:

    WHERE Date IN ( ?, ? )
    

    或者

    WHERE Date between ? and ?
    

    【讨论】:

      【解决方案4】:

      WHERE 子句传递了两个变量。尝试将它们称为{0}{1},或者使用javascript startDateendDate 中的名称。

      WHERE Date BETWEEN {0} and {1}
      

      或者,

      WHERE Date BETWEEN startDate AND endDate
      

      【讨论】:

      • 在我看来验证您的答案错误是指表格中的无效列。
      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 2021-09-19
      • 2020-06-28
      • 2021-07-02
      • 2019-08-14
      • 2013-07-18
      • 2016-10-04
      相关资源
      最近更新 更多