有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

WHERE子句中的MySQL语句中出现java错误

我正在尝试从我的表单中获取值“startDate”和“endDate”:

<form>
        <input id="startDate"/>                     
        <input id="endDate"/>
    </form

表单连接到一个javascript,javascript从那里进入一个MySQL数据库。问题是,每次在servlet中运行SQL查询时,都会出现以下错误:

捕获到SQLException:where子句中的未知列“startDate”

有人能看出我做错了什么吗? 祝朱莉今天愉快

已编辑代码:我已尝试编辑我的代码。我现在得到的错误是:Date startDate,上面写着:“复制局部变量startDate”。那当然是因为我有 字符串startDate=req。getParameter(“startDate”)。我再也不用用这个了? 包工作包

import java.io.*;
import java.sql.*;
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;
        String startDate = req.getParameter("startDate");
        String endDate= req.getParameter("endDate");
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", ""); 
            //Getting the data from database
            Date startDate;                                             
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE Date = ?";
            PreparedStatement pst = connection.prepareStatement(sql);
                pst.setDate(1,startDate);
                //pst.setString(2,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){
            System.out.println(e);
        }
        finally {

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

编辑: 以下是我的数据库的外观: http://postimg.org/image/3sbzplg9d/

这是我的javascript,我从日历中获取一些值:

<form>
        <input id="startDate"/>                     
        <input id="endDate"/>
    </form>
    <div id="startresult"></div>
    <div id="endresult"></div>
    <script>

    $(function(){
        $("#startDate").datepicker({
            dateFormat: 'yy-mm-dd',
            onSelect: function(dateText,inst){
                $('.selected-date').html(dateText);

                $.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');
                      }  
                    });
            }
        });
    });

    $(function(){
            $("#endDate").datepicker({
                dateFormat: 'yy-mm-dd',
                onSelect: function(dateText,inst){
                    $('.selected-date').html(dateText);

                    $.ajax({
                          url: "../getHoursSQL",
                          type: "post",
                          data: JSON,
                          success: function(data){
                              end: $("#endDate").val();
                              alert("success");
                              $("#endresult").html(data);
                          },
                          error:function(){
                              alert("failure");
                              $("#result").html('there is error while submit');
                          }  
                        });
                }
            });
        });

</script>

共 (3) 个答案

  1. # 1 楼答案

    据我从你的图片中所知(它相当混乱,信息太多),Workdata表中没有名为startDate的列。SQL语句中的所有列必须实际存在于相应的表中

    你是说专栏日期吗? 如果你这样做了,你就不应该使用

    pst.setString(1, startDate);
    

    因为这只适用于设置字符串列(varchar、longtext等)。相反,你应该使用

    pst.setDate(1, startDate);
    

    这里是一个java.sql.Date,而不是一个String

    编辑:

    为了回应你的更新,我更新了我的答案

    排队

    Date startDate;
    

    当然不会编译,因为startDate已经是声明为字符串的。即使更改了名称,也没有设置请求参数中给出的日期

    你需要这样做:

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date startDate = format.parse(req.getParameter("startDate"); 
    pst.setDate(1,startDate);
    

    您需要更改SimpleDataFormat构造函数中的字符串以满足您的需要(日期字符串的格式)。上述代码适用于格式为2014-03-11的日期。你的格式可能不同。见http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

  2. # 2 楼答案

    如果你想获取数据,那么你应该使用这个

    Date startDate;
    //use SqlDate instead of string.
    
    String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE Date = ?";
    PreparedStatement pst = connection.prepareStatement(sql);
    pst.setDate(1,startDate);
    

    现在,输出中有了一些内容,就像表中的date列一样

    更新:

    如果要对日期参数使用String数据类型。。移除Date startDate并保留现有内容。。之后,使用SimpleDataFormatter解析日期

    例如

    String startDate = req.getParameter("Date");
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    //surround below line with try catch block as below code throws checked exception
    Date start = sdf.parse(startDate);
    out.println(sdf.format(startDate)); //this is what you want yyyy-MM-dd  
    

    谢谢

  3. # 3 楼答案

    正如错误中提到的,它无法在表中找到该列。请检查您的表格Workdata是否有字段startDate

    而且,以字符串形式传递日期也不好,而且要小心使用=运算符来比较日期或日期时间字段。 我的建议是比较datetime useBETWEEN操作符

    ... WHERE startDate BETWEEN value1 AND value2