public void verhoogAantalGewonnenSpellen(Speler speler, Spel spel){
try(Connection conn = DriverManager.getConnection(Connectie.JDBC_URL)){
PreparedStatement query = conn.prepareStatement("UPDATE ID222177_g69.Speler SET ? = ? + 1 WHERE spelernaam = ?");
query.setString(1, "aantalGewonnen" + spel.getMoeilijkheidsgraad());
query.setString(2, "aantalGewonnen" + spel.getMoeilijkheidsgraad());
query.setString(3, speler.getNaam());
query.executeUpdate();
} catch(SQLException e){
throw new RuntimeException(e);
}
}
运行此代码会出现以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在' aantalGewonnenMakkelijk' aantalGewonnenMakkelijk'附近使用正确的语法。 =' aantalGewonnenMakkelijk' + 1 WHERE spelernaam =' ObamaJohansson'
表Speler
包含以下列:
spelernaam((VARCHAR(45)PK, NN)
wachtwoord((VARCHAR(45))NN)
aantalGewonnenMakkelijk(INT(11))
aantalGewonnenNormaal(INT(11)
aantalGewonnenMoeilijk(INT(11).
我一直在为这个例外苦苦挣扎几个小时,我似乎无法弄明白......有人可以帮帮我吗?
答案 0 :(得分:2)
coukd你需要setInt而不是setString
query.setInt(1, aantalGewonnen + spel.getMoeilijkheidsgraad());
query.setInt(2, aantalGewonnen + spel.getMoeilijkheidsgraad());
并且根据YCF_L的建议,你应该使用列名而不是var是set子句,例如:
UPDATE ID222177_g69.Speler SET your_column_name= you_column_name + 1
WHERE spelernaam = ?
或
UPDATE ID222177_g69.Speler SET your_column_name= ?
WHERE spelernaam = ?
答案 1 :(得分:0)
您不能像以前那样设置列的名称,而是可以使用这种方式连接查询和列的名称:
String colName = "aantalGewonnen" + spel.getMoeilijkheidsgraad();
String sql = String.format(
"UPDATE ID222177_g69.Speler SET %s = %s + 1 WHERE spelernaam = ?",
colName, colName
);
这会给你:
UPDATE ID222177_g69.Speler
SET aantalGewonnenSomeName = aantalGewonnenSomeName + 1
WHERE spelernaam = ?
然后像这样创建预备语句:
PreparedStatement query = conn.prepareStatement(sql);
query.setString(1, speler.getNaam());
我假设"aantalGewonnen" + spel.getMoeilijkheidsgraad()
为您提供了该列的名称。
重要强>
但这种方式不够安全,你必须检查名称是否正确,否则可能导致另一个语法错误或SQL注入。