SQLite SQLite Programm beendet/führt nicht weiter aus

XHann3sX

Aktives Mitglied
Hallo,


ich habe mich heute etwas mehr mit Datenbanken beschäftigt, dabei vorallem mit SQLLite ich wollte also einen Terminkalender schreiben , der die Termine halt in so einer Datenbank speichert also mit Datum, Beschreibung und evtl noch Ersteller , was aber erst unwichtig ist. Also wollte ich eine Test-Programme programmieren und etwas die Tutorials im Internet durcharbeiten und es kam dieses Programm zustande (schonmal Entschuldigung für die teils sinnlosen Variabeln Bezeichnungen etc. , habe die einfach so genannt 😀

Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLStuff {
    private static final SQLStuff stuff = new SQLStuff();
    private static Connection c;
    private static final String DB_PATH = System.getProperty("user.home")+"/"+"LOL.db";

    static{
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            System.err.println("Der JDBC-Treiber konnte nicht geladen werden");
            e.printStackTrace();
        }
    }
    private SQLStuff(){
    }
  
    public static SQLStuff getInstance(){
        return stuff;
    }
      
  
    public void intialisiereDBConc(){
        try {
            if(c != null)
                return;  
            System.out.println("Verbindung wird hergestellt");
            c=DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
            if(!c.isClosed())  
                System.out.println("Verbindung hergestellt!");
  
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        /*Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run() {
                try {
                    if(!c.isClosed() && c !=null){
                        c.close();
                    if(c.isClosed()){
                        System.out.println("Verbindung zur Datenbank wurde getrennt");
                    }
                    }
                } catch (SQLException e) {
                e.printStackTrace();
              
                }
            }
  
        });
*/
    }
  
    public void handelDB(){
        try {
            Statement st = c.createStatement();
            st.executeUpdate("DROP TABEL IF EXISTS lel;");
            st.executeUpdate("CREATE TABLE(Lel,lol,eier)");
            st.execute("INSERT INTO lel(Lel,lol,eier)VALUES(´Lel´,´LOL´,´3´");
            PreparedStatement pm = c.prepareStatement("INSERT INTO lel VALUES(?,?,?);");
            pm.setString(1, "lel");
            pm.setString(1, "Lol");
            pm.setInt(3, 5);
            pm.addBatch();
          
            c.setAutoCommit(false);
            pm.executeBatch();
            c.setAutoCommit(true);
          
            ResultSet rs = st.executeQuery("SELECT * FROM lel");
            while(rs.next()){
                System.out.println(rs.getString("Lel"));
                System.out.println(rs.getString("lol"));
                System.out.println(rs.getInt("eier"));
            }
        } catch (Exception e) {
        }
    }


}

Und hier noch die Main-Methode (ignoriert Version und MainFrame

Java:
public class MainClass {
    private final double VERSION = 0.5;

    public double getVERSION() {
        return VERSION;
    }
  
  
  
    public static void main(String[] args) {
    //MainFrame mf = new MainFrame();
        //mf.setVisible(true);
        SQLStuff ss = SQLStuff.getInstance();
        ss.intialisiereDBConc();
        ss.handelDB();
    }
  
  
}

undzwar sieht man in der DB-Hauptklasse , dass ein großer Bereich auskommentiert ist, da dieser immer ausgeführt wird , obwohl er ja eigentlich nur bei Beendigung ausgeführt werden soll oder beim Runterfahren und wenn ich das Programm mit diesen auskommentierten Zeilen starte , dann bleibt er bei der Konsolen-Ausgabe "Verbindung hergestellt!" und gibt nicht die Datenbank-Objekte aus.
Wie müsste ich das Programm ändern, das er mir die 2 gespeicherten Datenbank Objekte ausgibt ??

MFG
Hannes
 
Oh, das mit der Exception habe ich wohl verpennt , die Blöcke generiert Eclispe ja von selbst 😀
Oh ja es heißt TABLE ups, dass wird's wohl gewesen sein , werde gleich mal Testen

//Edit
Habe den Quelltext jetzt verbessert
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLStuff {
    private static final SQLStuff stuff = new SQLStuff();
    private static Connection c;
    private static final String DB_PATH = System.getProperty("user.home")+"/"+"LOL.db";

    static{
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            System.err.println("Der JDBC-Treiber konnte nicht geladen werden");
            e.printStackTrace();
        }
    }
    private SQLStuff(){
    }
   
    public static SQLStuff getInstance(){
        return stuff;
    }
       
   
    public void intialisiereDBConc(){
        try {
            if(c != null)
                return;   
            System.out.println("Verbindung wird hergestellt");
            c=DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
            if(!c.isClosed())   
                System.out.println("Verbindung hergestellt!");
   
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        /*Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run() {
                try {
                    if(!c.isClosed() && c !=null){
                        c.close();
                    if(c.isClosed()){
                        System.out.println("Verbindung zur Datenbank wurde getrennt");
                    }
                    }
                } catch (SQLException e) {
                e.printStackTrace();
               
                }
            }
   
        });
*/
    }
   
    public void handelDB(){
        try {
            Statement st = c.createStatement();
            st.executeUpdate("DROP [COLOR=#ff0000]TABLE[/COLOR] IF EXISTS lel[COLOR=#ff0000];");[/COLOR]
            st.executeUpdate("CREATE TABLE(Lel,lol,eier[COLOR=#ff0000]);"); [/COLOR]
            st.execute("INSERT INTO lel(Lel,lol,eier)VALUES(´Lel´,´LOL´,´3´)");
            PreparedStatement pm = c.prepareStatement("INSERT INTO lel VALUES(?,?,?);");
            pm.setString(1, "lel");
            pm.setString(1, "Lol");
            pm.setInt(3, 5);
            pm.addBatch();
           
            c.setAutoCommit(false);
            pm.executeBatch();
            c.setAutoCommit(true);
           
            ResultSet rs = st.executeQuery("SELECT * FROM lel");
            while(rs.next()){
                System.out.println(rs.getString("Lel"));
                System.out.println(rs.getString("lol"));
                System.out.println(rs.getInt("eier"));
            }
        } catch (Exception e) {
            [COLOR=#ff0000]e.printStackTrace();[/COLOR]
        }
    }


}

Nur wirft er mir jetzt diese Exception raus , die hatte er mir wohl aufgrund des fehlenden printStackTrace nicht gezeigt.

Java:
java.sql.SQLException: near "(": syntax error
    at org.sqlite.core.NativeDB.throwex(NativeDB.java:397)
    at org.sqlite.core.NativeDB._exec(Native Method)
    at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116)
    at SQLStuff.handelDB(SQLStuff.java:64)
    at MainClass.main(MainClass.java:16)
 
Zuletzt bearbeitet:
Ja, das war mir durch die Exception auch bewusst , dass in der Zeile was nicht stimmt, oder da in der Nähe, aber was 😀 Ich suche ja jetzt schon nach den ganzen SQL Sachen , da SQLite ja auch mit den SQL Statements arbeitet.
 
Es müsste doch eigentlich die Zeile 64 sein , was diesem Code Abschitt entspräche
Java:
 <63>st.executeUpdate("DROP TABLE IF EXISTS lel;");
<64>st.executeUpdate("CREATE TABLE(Lel,lol,eier);");
<65>st.execute("INSERT INTO lel(Lel,lol,eier)VALUES(´Lel´,´LOL´,´3´)");
 
Hmm, verstehe nicht ganz , wo der Fehler sein , aber da ich dieses statische eingefüge ja eh nicht unbedingt brauche , habe ich es einfach mal entfernt und es funktioniert auch alles und ich glaube es jetzt auch grundlegend verstanden zu haben. Hoffe ich kann es jetzt einfach so umsetzen, wäre trotzdem nett, wenn mir einer erklären könnte, wo der Fehler lag.

Edit. eine kleine Frage habe ich dann doch noch, warum gibt er bei der Ausgabe
Java:
ResultSet rs = st.executeQuery("SELECT * FROM lel");

            while(rs.next()){

                System.out.println(rs.getString("Lel"));

                System.out.println(rs.getString("lol"));

Beide aus? ist das durch diese executeQuery ?? und wenn ja was macht die Genau??Wäe nett wenn das noch einer kurz erklären kann und will.



Java:
    public void handelDB(){
        try {
            Statement st = c.createStatement();
            st.executeUpdate("CREATE TABLE IF NOT EXISTS lel(Lel,lol);");
            PreparedStatement pm = c.prepareStatement("INSERT INTO lel VALUES(?,?);");
            pm.setString(1, "lel");
            pm.setString(2, "Lol");
            pm.addBatch();
          
            pm.setString(1,"Test");
            pm.setString(2, "Hallo");
            pm.addBatch();
          
          
            c.setAutoCommit(false);
            pm.executeBatch();
            c.setAutoCommit(true);
          
            ResultSet rs = st.executeQuery("SELECT * FROM lel");
            while(rs.next()){
                System.out.println(rs.getString("Lel"));
                System.out.println(rs.getString("lol"));
              
            }
        } catch (Exception e) {
            e.printStackTrace();          
        }
    }


MFG
Hannes
 
Hmm, verstehe nicht ganz , wo der Fehler sein , aber da ich dieses statische eingefüge ja eh nicht unbedingt brauche , habe ich es einfach mal entfernt und es funktioniert auch alles und ich glaube es jetzt auch grundlegend verstanden zu haben. Hoffe ich kann es jetzt einfach so umsetzen, wäre trotzdem nett, wenn mir einer erklären könnte, wo der Fehler lag.
Du hast vergessen eine Tabellennamen anzugeben 😉

Edit. eine kleine Frage habe ich dann doch noch, warum gibt er bei der Ausgabe
Java:
ResultSet rs = st.executeQuery("SELECT * FROM lel");
  while(rs.next()){
  System.out.println(rs.getString("Lel"));
  System.out.println(rs.getString("lol"));

Beide aus? ist das durch diese executeQuery ?? und wenn ja was macht die Genau??Wäe nett wenn das noch einer kurz erklären kann und will.

Durch das * werden alle Spalten selektiert und da es keine WHERE Bedingung gibt werden alles Datensätze selektiert.
 
Achso , danke also hätte ich bei

Code:
st.executeUpdate("CREATE TABLE(Lel,lol,eier);");

einfach
Code:
st.executeUpdate("CREATE TABLE lel (Lel,lol,eier);");

machen müssen ??...... Ups , dann verstehe ich den Error natürlich auch , er weiß ja nicht welche DB er erstellen soll , aber egal Danke euch beiden für die Hilfe.
MFG
Hannes
 
Hmm hat aber auch ohne geklappt .... oder ist das nicht gut ?? und wie macht gebe ich den Datentyp an ?? Das stand in keinem Tutorial , welches ich gesehen habe oder ich habe es überlesen.
 

Zurück
Oben