我的 SQLite 数据库出现问题。简而言之:除了查询之外,一切正常(执行/创建表/...)。
重要:autoCommit = False(但我使用的查询函数不需要它)
代码如下:
---=> 数据库类<=---
package me.Syloh.Core;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import me.Syloh.Core.Customized.LOG;
public class Database {
public static Connection connection;
public static String path = "plugins/Core.db";
public static void setup() throws SQLException, ClassNotFoundException {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:" + path);
connection.setAutoCommit(false);
DatabaseMetaData metadata = connection.getMetaData();
ResultSet resultset = metadata.getTables(null, null, "%", null);
List<String> tables = new ArrayList<String>();
while(resultset.next()) {
tables.add(resultset.getString(3));
LOG.info("Table '" + resultset.getString(3) + "' has been found.");
}
if(!tables.contains("Bans")) {
execute("CREATE TABLE Bans (player TEXT, date TEXT, sender TEXT, reason TEXT, ip TEXT, time DOUBLE)");
LOG.info("Table 'Bans' has been created.");
}
}
public static void execute(String execute) {
try {
Statement statement = connection.createStatement();
statement.execute(execute);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void execute(List<String> execute) {
try {
Statement statement = connection.createStatement();
for(String e : execute) { statement.execute(e); }
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static ResultSet query(String query) {
try {
Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery(query);
statement.close();
return resultset;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void commit() {
try {
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
---=> Main.class <=---
package me.Syloh.Core;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin implements Listener {
Plugin Core = this;
@Override
public void onDisable() {
Database.commit();
}
@Override
public void onEnable() {
Bukkit.getServer().getPluginManager().registerEvents(this, this);
try {
Database.setup();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Core, new Runnable() {
public void run() {
Database.commit();
}
}, 60L, 4L);
Database.execute("INSERT INTO Bans VALUES ('hI', 'a', 'b', 'c', 'd', 1)");
ResultSet rs = Database.query("SELECT * FROM Bans WHERE player = 'hi'");
try {
while(rs.next()) {
System.out.println(rs.getString("player"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我已经使用 SQL 数据库编辑器检查了我的数据库,并且所有插入都已完成。但是当我尝试显示它们时,什么也没有显示。
请帮帮我!提前致谢。
真诚的, 最大
最佳答案
问题是,您正在关闭 语句
,这将自动关闭关联的 ResultSet
:
Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery(query);
statement.close(); // This is the problem
return resultset;
来自 Statement#close()
文档:
When a Statement object is closed, its current ResultSet object, if one exists, is also closed.
话虽如此,你永远不应该在你的方法周围传递你的 ResultSet
对象。这种方式将很难管理资源,因为您必须保持 Statement
和 ResultSet
对象跨方法打开。
您应该使用获取 ResultSet
的相同方法构建一些数据结构,然后返回该数据结构。
此外,您应该在 finally
block 中关闭资源,例如 ResultSet
、Statement
和 Connection
,以确保它们始终处于关闭状态,即使在出现异常情况时也是如此。
关于java - (Java) SQL 查询根本不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166456/