簡體   English   中英

(Java)SQL查詢根本不返回任何內容

[英](Java) SQL Query not returning anything at all

我的SQLite數據庫有問題。 簡而言之:除查詢外,其他所有東西都在工作(執行/創建表/ ...)。

重要說明:autoCommit = False(但是我使用的查詢功能不是必需的)

這是代碼:

--- => Database.class <= ---

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數據庫編輯器簽出了數據庫,並完成了所有插入操作。 但是當我試圖顯示它們時,什么也沒有顯示。

請幫我! 提前致謝。

真誠的,馬克斯

問題是,您正在關閉statement ,它將自動關閉關聯的ResultSet

Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery(query);
statement.close();  // This is the problem
return resultset;

Statement#close() javadoc:

當Statement對象關閉時,其當前ResultSet對象(如果存在)也將關閉。

話雖如此,您永遠不要在方法周圍傳遞ResultSet對象。 這樣,將很難管理資源,因為您必須在各種方法之間保持對StatementResultSet對象的打開狀態。

您應該使用與獲取ResultSet相同的方法構建一些數據結構,然后返回該數據結構。

另外,您應該在finally塊中關閉諸如ResultSetStatementConnection類的資源,以確保即使在出現異常的情況下,它們也始終處於關閉狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM