如何删除错误[Microsoft] [ODBC Microsoft Access驱动程序]查询表达式' date = 19apr2015中的语法错误(缺少运算符)。'

时间:2015-04-18 19:24:15

标签: java ms-access odbc

请告诉我如何从代码中解决错误。我想从ms访问表中获取详细信息。我使用数据和描述作为列。 date是ms访问的主键。所以请让我帮助我从ms访问表中读取数据。


try{   
    connect();     
    stmt = (Statement) conn.createStatement();
    String sql, ks = " ";
    ks = JOptionPane.showInputDialog("enter the date of which you want to read");      
    String jk = " where date=" + ks; 


    sql = "SELECT [date],[description]  FROM  Table2" + jk;
    System.out.println("1");
    rs = ((java.sql.Statement) stmt).executeQuery(sql);

    if(rs.next())
    {
        String date1="hello",description1="hii";
        date1 = rs.getString("date");
        description1=rs.getString("description");
        JOptionPane.showMessageDialog(null,"Date:"+date1+"\n"+description1);
    }
    else
    {
        JOptionPane.showMessageDialog(null,"Sorry the record does not exist");
        try
        {
            close();
        }
        catch(Exception ea)
        {
            JOptionPane.showMessageDialog(null, "Error:"+ea.getMessage());
        }
    }
}
catch(Exception ew)
{
    JOptionPane.showMessageDialog(null, "Unable to fetch Data");
    JOptionPane.showMessageDialog(null,""+ew.getMessage());
    System.out.println(""+ew);
}

由于

1 个答案:

答案 0 :(得分:0)

您的错误消息显示SQL查询中存在语法错误。在您的示例中,它似乎是:

SELECT [date],[description] FROM Table2  where date=19apr2015.

这是错误的,因为日期(19apr2015)的格式不正确。

正确的SQL查询是:

SELECT [date],[description] FROM Table2  where date=#4/19/2015#

因此,您必须解析用户输入并将其转换为正确的形式,或请求用户以正确的形式输入日期。

SQL注入

在这两种情况下,建议使用带有日期作为参数的PreparedStatement,而不是使用字符串连接将SQL语句放在一起,因为后者因为一个名为SQL injection的邪恶事物而很危险!例如,想象一下,用户想要做任何伤害而不是输入有效日期,他/她进入

#1/1/2000#; DELETE * FROM Table2

因此,您的数据库将执行以下SQL语句:

SELECT [date],[description] FROM Table2 where date=#1/1/2000#; DELETE * FROM Table2

第二个声明会简单地删除所有数据! (确切地说,上面的语句将失败,因为MS Access不支持链接多个语句,但其他数据库系统确实支持这一点,因此这是一个安全漏洞,在您迁移数据库之前一直在睡眠。除此之外,还有在MS Access中进行SQL注入的其他方法,例如使用子查询。)

使用PreparedStatement可以避免此问题。除此之外,编程更方便:

Date date = /* java.sql.Date-object created from user input */

try (PreparedStatement stmt = conn.prepareStatement(
        "SELECT [date],[description] FROM Table2 where date=?")
    ) {

    // set first (and only) parameter value
    stmt.setDate(1, date);

    // execute statement
    try (ResultSet result = stmt.executeQuery()) {
        // process result as usual
    }
}