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

Posted

技术标签:

【中文标题】如何删除查询表达式“date=19apr2015”中的错误 [Microsoft][ODBC Microsoft Access Driver] 语法错误(缺少运算符)。【英文标题】:How to delete error [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'date=19apr2015.' 【发布时间】: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 子句中存在语法错误。请参阅 ***.com/questions/11814853/… 或 techrepublic.com/article/… 了解如何在 MS Access 中使用日期。 我使用字符串作为日期。我的意思是字符串已用于存储数据,例如 19apr2015。我在访问表中使用了长文本作为日期 【参考方案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 可能会导致严重的安全漏洞。为简单起见,我没有提到那个细节。但我会更新我的答案。谢谢。

以上是关于如何删除查询表达式“date=19apr2015”中的错误 [Microsoft][ODBC Microsoft Access Driver] 语法错误(缺少运算符)。的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 表 无法更新和删除 子查询返回的值不止一个

使用表达式生成器删除 SQL SSIS 变量中的结尾括号?

database 如何查询某个字段以某个字母开头的数据

字符串函数(正则表达式?)从 url 字符串中删除查询字符串对

SQL 中删除语法的问题 - 当子查询没有与 EXISTS 一起引入时,错误只能在选择列表中指定一个表达式

Laravel 查询构建器:如何访问 JSON 键/值对