2013-08-10 4 views
1

У меня проблема с моей базой данных SQLite. Чтобы привести это в соответствие: все работает (выполняет/создает таблицу/...), за исключением запросов.(Java) SQL Query ничего не возвращает

Важно: 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, и все вставки были сделаны. Но когда я пытаюсь отобразить их, ничего не отображается вообще.

Пожалуйста, помогите! Заранее спасибо.

С уважением, Max

ответ

2

Проблема, вы закрываете statement, который автоматически закроет связанный ResultSet:

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

От Statement#close() Javadoc:

Когда заявление объект закрыт, его текущий объект ResultSet, если он существует, также закрыт.

Сказав это, вы не должны проходить вокруг своего объектавокруг своих методов. Таким образом, было бы очень сложно управлять ресурсами, так как вам нужно было бы сохранить свои Statement иобъекты, открытые по методам.

Вы должны построить некоторую структуру данных в том же методе, в котором вы получаете , и вместо этого возвращаете эту структуру данных.

Кроме того, вы должны закрыть ресурсы, такие как, ResultSet, Statement и Connection в finally блоке, с тем, чтобы гарантировать, что они всегда закрыты, даже в случае исключения.

+0

О, боже, спасибо вам, ТАК МНОГО! Работала отлично, но я понял, что SQL не чувствителен к регистру, так или иначе, чтобы добавить поддержку в свой код? (Case Sensitive SQL Queries), потому что я видел изменения в стороне базы данных! THX – user2671258

+0

* «но я понял, что SQL не чувствителен к регистру» * SQL не чувствителен к регистру и не учитывает регистр в терминах значений в столбцах. Это зависит от используемой СУБД и используемых параметров (иногда на основе столбцов). –

+0

Кроме того, более важный вопрос: если я не закрываю утверждение, значит ли это, что инструкция находится где-то на холостом ходу? – user2671258

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