我的音乐机器人出了点问题,不和谐。我想在曲目列表启动时发送嵌入消息,但ResultSet总是关闭。所以它不能传递if-query。
下面是我的代码(“TrackScheduler”类):
try {
file = new URL("https://img.youtube.com/vi/" + videoID + "/hqdefault.jpg").openStream();
builder.setImage("attachment://thumbnail.png");
System.out.println("4");
ResultSet set = LiteSQL.onQuery("SELECT * FROM musicchannel WHERE guildid = " + guildid);
try {
System.out.println("3");
if(set.next()) {
long channelid = set.getLong("channelid");
TextChannel channel;
System.out.println("2");
if((channel = guild.getTextChannelById(channelid)) != null) {
System.out.println("1");
channel.sendTyping().queue();
channel.sendFile(file, "thumbnail.png").embed(builder.build()).queue();
}
}
}
catch (SQLException e) {
e.printStackTrace();
}
}
catch (IOException e) {
e.printStackTrace();
}
}我的LiteSQL.onQuery (“LiteSQL”类):
private static Connection c;
private static Statement s;
public static ResultSet onQuery(String sql) {
try {
return s.executeQuery(sql);
}
catch(SQLException e) {
e.printStackTrace();
}
return null;
}下面是错误:
ava.sql.SQLException: ResultSet closed
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:76)
at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:39)
at org.sqlite.jdbc3.JDBC3ResultSet.getLong(JDBC3ResultSet.java:423)
at de.nameddaniel.bot.musik.TrackScheduler.onTrackStart(TrackScheduler.java:79)
at com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter.onEvent(AudioEventAdapter.java:72)
at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer.dispatchEvent(DefaultAudioPlayer.java:368)
at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer.startTrack(DefaultAudioPlayer.java:117)
at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer.playTrack(DefaultAudioPlayer.java:80)
at de.nameddaniel.bot.musik.AudioLoadResult.trackLoaded(AudioLoadResult.java:20)
at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.checkSourcesForItemOnce(DefaultAudioPlayerManager.java:443)
at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.checkSourcesForItem(DefaultAudioPlayerManager.java:419)
at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$createItemLoader$0(DefaultAudioPlayerManager.java:218)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)我是新来的,如果有任何遗漏的信息,请告诉我。同样,我对糟糕的格式表示抱歉。
大牛,问候:)
发布于 2020-06-23 22:09:11
tl;dr
不要在Statement和Connection字段中使用static。
详细信息
PreparedStatement,并且希望您的SQL查询仅使用字符串文字。永远不要通过连接中的用户输入来“生成查询字符串”。查询字符串应该是SELECT * FROM musicchannel WHERE guildid = ? (是,字符串中有一个文字问号),然后使用PreparedStatement的setInt方法设置公会id。或者更好的是,由于JDBC API实际上不是为像这样的使用而设计的,所以可以使用类似于JDBI.的东西
throw new RuntimeException("Uncaught", e);而不是e.printStackTrace();。更好的是,让这些方法只抛出SQLException;显然做DB事情的方法应该抛出它。请注意,您的main方法可以(也应该)声明为抛出Exception。的原因
发布于 2020-06-23 22:13:55
(除了另一个答案,实际上都是非常好的建议,你应该遵循)我认为以下是问题所在:
return s.executeQuery(sql);如果它是静态的,并且被其他对象多次使用,我认为这不会起作用。它最终会被清理干净的。您应该只返回一个包含所需数据的对象,而不是在那里这样做。查看DAO类模式。
https://stackoverflow.com/questions/62536450
复制相似问题