我试图将一些网站的信息存入访问数据库。 我正在从我获得的网站信息中创建一个bean,然后将该bean发送到数据库中。 问题是我被阻止通过异常将某些东西带入数据库。 例外 -
net.ucanaccess.jdbc.UcanaccessSQLException: unexpected token: (token) required:
所以我已经检查了产生此异常的值的共同点。 它是一个撇号。 调用异常的每个值都有一个撇号,我现在无法真正改变它。所以我一直想知道如何让ucanaccess在没有任何例外的情况下将撇号用于访问?
这是查询语句
stmnt = conn.prepareStatement("INSERT INTO Table1(doctorName , description , specialty1 , specialty2 , personalSite , clinic1 , phone1 , clinic2 , phone2 , clinic3, phone3 ,worksWith) VALUES (?,?,?,?,?,?,?,?,?,?,?,?");
stmnt.setString(1,tempBean.getDoctorName());
stmnt.setString(2,tempBean.getDescription());
stmnt.setString(3,tempBean.getSpeciality1());
stmnt.setString(4,tempBean.getSpeciality2());
stmnt.setString(5,tempBean.getPersonalSite());
stmnt.setString(6,tempBean.getClinic1());
stmnt.setString(7,tempBean.getPhone1());
stmnt.setString(8,tempBean.getClinic2());
stmnt.setString(9,tempBean.getPhone2());
stmnt.setString(10,tempBean.getClinic3());
stmnt.setString(11,tempBean.getPhone3());
stmnt.setString(12,tempBean.getWorksWith());
stmnt.executeUpdate();
答案 0 :(得分:2)
您遇到了一个称为sql注入的常见问题。
使用Java,确保不会发生这种情况的方法是使用PreparedStatements。 从另一个问题看一下this answer就是一个很好的例子。
答案 1 :(得分:1)
对于未来的读者:
您应该使用PreparedStatement来避免SQLInjection并避免使用ESCAPE文本值。 在SQL(包含所有dbms'以及所有驱动程序)中,在这种特定情况下,您应该使用另一个撇号来转义撇号:
因为UCanAccess支持Access语法,所以当双引号"使用的是分隔符而不是撇号(在这种情况下,单词中间的双引号必须使用另一个双引号&#34进行转义;)。
如果没有,sql引擎
我不知道撇号是文本分隔符还是它的一部分。
但是如果你使用PreparedStatement,你不必担心它。