如何删除查询表达式“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 表 无法更新和删除 子查询返回的值不止一个
字符串函数(正则表达式?)从 url 字符串中删除查询字符串对