我试图这样做:
String insertQuery=" DELETE FROM Accounts WHERE Username= " + Username + ";";
但我得到了这个错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'sam' in 'where clause'
它获得正确的用户名等我通过测试知道这一点,我认为语法错误但我没有语法错误?
该表名为Accounts。 coloums是用户名&密码,
答案 0 :(得分:5)
您缺少单引号。在你的情况下(它的字符串)变量需要包含在它们中,否则它将被解释为列。
String insertQuery = "DELETE FROM Accounts WHERE Username = '" + Username + "'";
因此,我建议您使用占位符来避免此类问题。不要忘记关心安全性(例如SQL Injection)。值得一提的是,参数化语句也更易于阅读,更安全,更快速。
我不喜欢“硬编码”查询。让我们假设一个场景,如果你有一个包含十列的表格,并想象一下你在这种情况下的查询方式:绝对是人类不可读的。
使用参数化语句总是非常有效和舒适的练习。您的代码看起来很好并且变得易于阅读,什么是“主要”解决方案更加安全和清洁。
请看PreparedStatements。基本示例:
private final String deleteQuery = "DELETE FROM Accounts WHERE Username = ?";
public boolean deleteObject(String username) {
Connection c = null;
PreparedStatement ps = null;
try {
c = DataSource.getConnection();
ps = c.prepareStatement(deleteQuery);
ps.setString(1, username); // numbering starts with 1 not 0!
return ps.executeUpdate() > 0;
}
catch (SQLException ex) {
System.out.println("Error in deleteObject() method: " + ex.getMessage());
return false;
}
finally {
if (c != null) {
try {
c.close();
}
catch (SQLException ex) {
System.out.println("Error in closing conn: " + ex.getMessage());
}
}
}
}
答案 1 :(得分:2)
如果username是varchar,则需要在where子句中的值周围添加单引号。
String insertQuery=" DELETE FROM Accounts WHERE Username= '" + Username + "';";
由于没有引用该值来识别用户名,我假设其Sam为列。