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