У меня проблема, что я просто не могу запустить следующий код. Я пробовал и изменил их все, но я всегда получаю сообщение об ошибке, может быть, вы знаете, где ошибка?
public class TestCommand implements ServerCommand{
@Override
public void performcommand(SlashCommandInteractionEvent event, Member m, MessageChannelUnion channel,
VoiceChannel ec, VoiceChannel pub, TextChannel log, Guild guild) {
Connection connection = null;
PreparedStatement preparedStatement = null;
String sql = ("UPDATE member_ships SET?= ? WHERE UUID= ?");
try {
connection = MySQL.getConnection();
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"Cyclone");
preparedStatement.setInt(2,9);
preparedStatement.setLong(3,316931131188576123l);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
MySQL.closePreparedStatement(preparedStatement);
MySQL.closeConnection(connection);
}
}
}
Класс MySQL
public class MySQL {
public static Connection getConnection() throws SQLException {
Connection connection = DriverManager.getConnection("jdbc:mysql://*****","***","****");
connection.setAutoCommit(true);
System.out.println("Database connecion successful"); //TODO Remove
return connection;
}
И вот трассировка стека ошибки:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''Cyclone'= 9 WHERE UUID= 316931131188576123' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1320)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:994)




Вы не можете привязывать имена объектов (в данном случае имя столбца), только значения.
Сказав это, поскольку все значения здесь кажутся жестко закодированными, вам действительно не нужен PreparedStamtement, и вы можете просто выполнить оператор напрямую:
con.executeUpdate("UPDATE member_ships SET Cyclone = 9 WHERE UUID = 316931131188576123l");
Ааа большое спасибо, я этого не знал, теперь я сделал это по-другому, и это работает. В реальном проекте переменные не фиксируются, я их просто убрал, чтобы проще было найти ошибку.