2016-11-01 4 views
0

у меня есть проблема с ошибкой синтаксиса SQL, мой запрос и код выглядит следующим образом:SQL Ошибка синтаксиса с зарезервированными словами (Java)


@Override 
public void insert() { 
    try { 
     PreparedStatement stmt = Main.getSQL().getConnection().prepareStatement(
       "INSERT INTO `" + Settings.mysqlPref + "guilds` (name, tag, owner, allies, points, kills, deaths, validity, " + 
         "attacked, home, members, pvp, born, lives, bossHealth) " + 
         "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
     stmt.setString(1, name); 
     stmt.setString(2, tag); 
     stmt.setString(3, ownerUniqueId.toString()); 
     stmt.setString(4, Serializer.serializeList(allies)); 
     stmt.setInt(5, getPoints()); 
     stmt.setInt(6, kills); 
     stmt.setInt(7, deaths); 
     stmt.setLong(8, validity); 
     stmt.setLong(9, protection); 
     stmt.setString(10, Serializer.serializeLocation(home)); 
     stmt.setString(11, Serializer.serializeList(members)); 
     stmt.setBoolean(12, pvp); 
     stmt.setLong(13, born); 
     stmt.setInt(14, lives); 
     stmt.setInt(15, bossHealth); 
     stmt.executeUpdate(); 
     stmt.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

Вот трассировки стека:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''name', 'tag', 'owner', 'allies', 'points', 'kills', 'deaths', 'validity', 'atta' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:407) 
    at com.mysql.jdbc.Util.getInstance(Util.java:382) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310) 
    at me.khalit.prostorm.tools.data.Guild.insert(Guild.java:126) 
    at me.khalit.prostorm.tools.util.thread.Work.execute(Work.java:71) 
    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71) 
    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Проблема - для меня это работает правильно, но для моего клиента (как вы видите выше) это не так. Я не знаю, в чем проблема, потому что для меня все работает правильно. На SQLite или MySQL нет никакой разницы.

Я видел, что это проблема с зарезервированными словами в MySQL, но я сделал 'guilds', и он должен работать правильно. К сожалению, это не для моего клиента.

Я просто сдался, может быть, у вас, ребята, есть некоторые решения? Я не знаю, какие фрагменты кода вам нужны, поэтому скажите мне, требуется ли что-либо.

+2

'' 'name'' выглядит подозрительно для меня. Может быть, что-то лишнее? – talex

+2

Что такое 'Settings.mysqlPref'? –

+0

Я настоятельно рекомендую вам использовать SQL-Query Builder, например Jooq/Speedment. Обычный SQL в приложении Java - это головная боль .. –

ответ

0

Что такое Settings.mysqlPref? Если это имя базы данных, вы не можете иметь имя db_name.table_name, заключенное в обратные ссылки. Вам нужно либо удалить обратные такты, либо поместить их вокруг имени db_ и занести имя таблицы. Имеют смысл?

+0

Это префикс для базы данных, например 'Prefix_MainTableName'. – SocketByte

+0

@xVacuumis Возможно, что в базе данных вашего клиента префикс включает имя db? например 'my_db.Prefix_MainTableName'? Если это так, CptMisery прав. Попробуйте полностью удалить обратные выходы. В любом случае, это головная боль. И если вы можете, в будущем, не строить SQL-команды как строки! Это мир боли. – Galz

Смежные вопросы