【问题标题】:How to delete error [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'date=19apr2015.'如何删除查询表达式“date=19apr2015”中的错误 [Microsoft][ODBC Microsoft Access Driver] 语法错误(缺少运算符)。
【发布时间】:2015-04-18 19:24:14
【问题描述】:

请告诉我如何解决代码中的错误。我想从 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);
}

谢谢

【问题讨论】:

  • 修正你的格式,我会告诉你错误的原因! ;)
  • 我猜它的格式看起来不错。
  • 不客气。格式化是一个常见的错误:)
  • @KarrthikReddyChinasani 您的错误与 java 无关。 SQL 查询的 where 子句中存在语法错误。请参阅 stackoverflow.com/questions/11814853/…techrepublic.com/article/… 了解如何在 MS Access 中使用日期。
  • 我使用字符串作为日期。我的意思是字符串已用于存储数据,例如 19apr2015。我在访问表中使用了长文本作为日期

标签: java ms-access odbc


【解决方案1】:

您的错误消息表明您的 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
    }
}

【讨论】:

  • > 第二条语句将简单地删除您的所有数据! ... 不在 Access SQL 中 - 它会导致整个语句失败。
  • @Gustav 你是对的,MS Access 不支持语句链接。但是其他数据库会这样做,因此将代码迁移到另一个 DBMS 可能会导致严重的安全漏洞。为简单起见,我没有提到那个细节。但我会更新我的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多