2012-07-03 3 views
2

Я пытаюсь написать плагин магазина для моего сервера Minecraft, но я все время получаю сообщение об ошибке, когда кто-либо выполняет команду/purchase ,com.mysql.jdbc.MysqlDataTruncation: Усечение данных: Усеченное неправильное значение DOUBLE: ', 3'

Вот ошибка:

 
2012-07-03 04:27:28 [SEVERE] com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: ',3' 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3591) 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662) 
2012-07-03 04:27:28 [SEVERE] at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581) 
2012-07-03 04:27:28 [SEVERE] at com.Chipmunk9998.Cod.CodCommandExecutor.onCommand(CodCommandExecutor.java:1421) 
2012-07-03 04:27:28 [SEVERE] at org.bukkit.command.PluginCommand.execute(PluginCommand.java:40) 
2012-07-03 04:27:28 [SEVERE] at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:166) 
2012-07-03 04:27:28 [SEVERE] at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:479) 
2012-07-03 04:27:28 [SEVERE] at com.Chipmunk9998.Cod.CodCommandExecutor.onCommand(CodCommandExecutor.java:1443) 
2012-07-03 04:27:28 [SEVERE] at org.bukkit.command.PluginCommand.execute(PluginCommand.java:40) 
2012-07-03 04:27:28 [SEVERE] at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:166) 
2012-07-03 04:27:28 [SEVERE] at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:479) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:821) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:781) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:764) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:34) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.NetworkManager.b(NetworkManager.java:229) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:113) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:78) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:567) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:459) 
2012-07-03 04:27:28 [SEVERE] at net.minecraft.server.ThreadServerApplication.run(SourceFile:492) 

И вот мой код:

if (cmdsender == null) { 
    File weaponFile = new File(plugin.getDataFolder(), "weapons.yml"); 
    FileConfiguration weaponData = YamlConfiguration.loadConfiguration(weaponFile); 

    String sql = "UPDATE account_info SET Money = Money - " 
    + weaponData.getString(args[0] + "." + args[1] + ".Price") 
    + " WHERE Username = '" + args[2] + "'"; 

    try { 
    plugin.st.executeUpdate(sql); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } 

    sql = "UPDATE account_info SET Bought_" + args[0] + " = Bought_" + args[0] 
    + " + ," + args[1] + " WHERE Username = '" + args[2] + "'"; 

    try { 
    plugin.st.executeUpdate(sql); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } 

    plugin.getServer().getPlayer(args[2]).sendMessage(
    "You have successfully bought the " 
    + weaponData.getString(args[0] + "." + args[1] + ".Name") + "." 
); 

    return true; 
} 

я пытался прибегая к помощи, но не смогли найти ничего, что помогло.

+0

Я предполагаю, что это связано с вашими аргументами []. Можете ли вы сделать простой System.out.println() своих аргументов [], чтобы проверить их значения? – Sujay

+0

просто напишите и проверьте sql как System.out.println (sql); Я думаю, что значение, которое ожидается как double, передается как строка с запятой. Таким образом, запрос вызывает ошибку. –

ответ

3

Похоже, у вас есть ошибка в этой строке:

sql = "UPDATE account_info SET Bought_" + args[0] + " = Bought_" + args[0] 
    + " + ," + args[1] + " WHERE Username = '" + args[2] + "'"; 

Там ошибочная запятой в этой строке перед args[1]. Если args[0], args[1] и args[2] содержат 1, 3 и foo соответственно, то sql будет вычисляться:

UPDATE account_info SET Bought_1 = Bought_1 + ,3 WHERE Username = 'foo' 

Что явно ошибка синтаксиса и объясняет ваше сообщение об ошибке Data truncation: Truncated incorrect DOUBLE value: ',3'.

+0

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

+0

@DavidCarpenter: для этого вам нужно будет использовать функцию MySQL '' CONCAT() ') (http://dev.mysql.com/doc/en/string-functions.html#function_concat) и процитировать строковые литералы например '... = CONCAT (Bought_" + args [0] + ", '," + args [1] + "') WHERE ...'. Тем не менее, вы должны [нормализовать] (http://en.wikipedia.org/wiki/Database_normalization) вашу структуру данных, сохраняя, например, '(Username, Bought)' пары в отдельной таблице, с помощью которых вы могли бы [присоединиться] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins. html) ваши запросы по мере необходимости. – eggyal

-2

Я кодировал JSP для обновления записей базы данных, используя запрос UPDATE. «UPDATE customer_details установить Customer_fname = ?, Customer_lname = ?, Customer_home_address = ?, Customer_office_address = ?, Customer_mobile_no = ?, Customer_city = ?, Customer_state = ?, Customer_dob =? Где user_id =?

в последнем параметре user_id в .... я случайно написать ps.setString (9, uname) который отличался переменной с различным типом данных .... которые дают мне ошибку усечения данных:. неверную doublevalue

я исправил с ps.setInt (9, uid) который был правильной переменной и типом данных, затем ошибка пропал....!!