# Java SQLite Error



## Feras (1. Nov 2015)

Hi, ich möchte eine JTable erstellen, die ihre Daten aus einer Datenbank bezieht. Dazu habe ich ein kleines Testprogramm geschrieben, bei dem man 5 Daten eingibt, die dann in die Tabelle übertragen werden. Ich erhalten jedoch in der Console den Fehler: "java.sql.SQLException: no such column: ID" und weiß nicht warum?


```
public class SQLite     {

   public static DefaultTableModel model = new DefaultTableModel();
   private static JTextField fieldID;
   private static JTextField fieldName;
   private static JTextField fieldAge;
   private static JTextField fieldAddress;
   private static JTextField fieldSalary;

  public static void main( String args[] )     {

  Connection c = null;
  Statement stmt = null;
  try {
  Class.forName("org.sqlite.JDBC");
  c = DriverManager.getConnection("jdbc:sqlite:test.db");
  c.setAutoCommit(false);
  System.out.println("Opened database successfully");

  stmt = c.createStatement();

  c.commit();
  
  JFrame f = new JFrame();
  f.setLayout(new GridLayout(5,1));
  f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  
  JTable table = new JTable(model);
  f.add( new JScrollPane( table ) );
  
    model.addColumn("id");
    model.addColumn("name");
    model.addColumn("age");
    model.addColumn("address");
    model.addColumn("salary");
  
  fieldID = new JTextField("ID");
  fieldName = new JTextField("Name");
  fieldAge = new JTextField("Age");
  fieldAddress = new JTextField("Address");
  fieldSalary = new JTextField("Salary");
  
  String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
        "VALUES ("+fieldID.getText()+","+fieldName.getText()+","+fieldAge.getText()+","+fieldAddress.getText()+","+fieldSalary.getText()+");";
  stmt.executeUpdate(sql);
  
  ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
  while ( rs.next() ) {
  int id = rs.getInt("id");
  String  name = rs.getString("name");
  int age  = rs.getInt("age");
  String  address = rs.getString("address");
  float salary = rs.getFloat("salary");
      
       model.addRow(new Object[] {id, name, age, address, salary});
  }
  
  /**JTextField feldID = new JTextField("ID");
  JTextField feldName = new JTextField("Name");
  JTextField feldAge = new JTextField("Age");
  JTextField feldAddress = new JTextField("Address");
  JTextField feldSalary = new JTextField("Salary");
     **/
  
  f.pack();
  f.setVisible( true );

  rs.close();
  stmt.close();
  c.close();
  } catch ( Exception e ) {
  System.err.println( e.getClass().getName() + ": " + e.getMessage() );
  System.exit(0);
  }
  System.out.println("Operation done successfully");
  }
}
```


----------



## Joose (2. Nov 2015)

Feras hat gesagt.:


> Ich erhalten jedoch in der Console den Fehler: "java.sql.SQLException: no such column: ID" und weiß nicht warum?



Die Fehlermeldung beschreibt doch den Fehler ganz gut. Der Treiber findet die Spalte "Id" der Tabelle "Company" nicht. Wie schaut deine Tabellenstruktur aus?
Bevor du anfängst hier UI und Datenbank einfach zu mischen. Hau den UI Dreck raus und lies einfach ein paar Werte von der Konsole ein welche du in die Datenbank schreibst und lies sie danach wieder aus.
Durch das UI hast du einfach nur eine zusätzliche unnötige Fehlerquelle in deinem einfachen Program.


----------



## Feras (6. Nov 2015)

Also ich habe das ganze jetzt mal ohne UI programmiert und für die verschiedenen SQL Befehle(INSERT, CREATE,...) eigenen Methoden erstellt. Diese enthalten jedoch nur Musterwerte, wie hier zum Beispiel bei der CREATE Methode. Nun möchte ich über die Konsole eigenen Werte eingeben können und damit dann eine Tabelle erstellen. Ich habe jedoch keine Ahnung, wie man das machen könnte?

Hier mal die CREATE Methode:


```
public static void createTable() {
  
     Connection c = null;
    Statement stmt = null;
  
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
    
      stmt = c.createStatement();

      String sql = "CREATE TABLE COMPANY " +
    "(ID INT PRIMARY KEY  NOT NULL," +
    " NAME  TEXT  NOT NULL, " +
    " AGE  INT  NOT NULL, " +
    " ADDRESS  CHAR(50), " +
    " SALARY  REAL)";
    
      stmt.executeUpdate(sql);
    
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
  
   }
```

Und hier die MEthode in der die Musterdaten in die Tabelle eingefügt werden. Hier möchte ich gern individuelle über die Konsole eingeben können.


```
public static void hinzufügen() {

     Connection c = null;
    Statement stmt = null;
  
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
    
      stmt = c.createStatement();

      String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (1, 'Paul', 32, 'California', 20000.00 );";
    stmt.executeUpdate(sql);

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );";
    stmt.executeUpdate(sql);

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );";
    stmt.executeUpdate(sql);

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
    stmt.executeUpdate(sql);
    
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
  
   }
```


----------



## Thallius (6. Nov 2015)

warum so kompliziert?

starte doch einfach mysql.exe in der CMD-Shell oder im Terminal (ka welches OS du nutzt) und gibt die BEfehle direkt ein. Da bekommst du die besten Fehlermeldungen und kannst auch am schönsten ein Gefühl für mySQL bekommen.

Gruß

Claus


----------



## Feras (9. Nov 2015)

Thallius hat gesagt.:


> warum so kompliziert?
> 
> starte doch einfach mysql.exe in der CMD-Shell oder im Terminal (ka welches OS du nutzt) und gibt die BEfehle direkt ein. Da bekommst du die besten Fehlermeldungen und kannst auch am schönsten ein Gefühl für mySQL bekommen.
> 
> ...



Ich nutze bei dem Code SQLite. Kann ich die mysql.exe da auch verwenden? Das ding ist halt, dass ich die BEfehle jetzte schon ungefähr kann. Bloß möchte ich die ja in den Code integreieren können, so dass es individuelle Eingaben erlaubt.


----------



## Joose (9. Nov 2015)

Nein die "mysql.exe" wird im Zusammenhang mit SQLite nicht funktionieren (habe aber auch noch nie die Idee gehabt das auszuprobieren )

Funktioniert dein Code oben mit den fixen Eingaben?
Wenn ja kannst du mal PreparedStatements anschauen, die sollte man verwenden wenn man einen "variablen" SQL Befehl haben will. Die Parameter für die PreparedStatements könntest du dann eben über die Konsole einlesen


----------



## Harry Kane (9. Nov 2015)

Bevor wir hier vom eigentlichen Thema abdriften: in welcher Zeile aus deinem ersten Beitrag fliegt der Fehler?
Mir kommt das hier verdächtig vor:


Feras hat gesagt.:


> ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
> *while* ( rs.next() ) {
> *int* id = rs.getInt("id");


Du willst den Wert aus der Spalte "id", in deiner Tabellendefinition ist der Spaltenname aber groß geschrieben. Vielleicht scheiterts ja daran?


----------



## JStein52 (9. Nov 2015)

Ich glaube hier wird über ein Problem diskutiert das es gar nicht mehr gibt. Die letzte Version des TE scheint ja zu funktionieren und er will das ganze jetzt so umbauen dass er von der Konsole Werte einlesen und in die DB einfügen kann.


----------



## Harry Kane (9. Nov 2015)

JStein52 hat gesagt.:


> Ich glaube hier wird über ein Problem diskutiert das es gar nicht mehr gibt. Die letzte Version des TE scheint ja zu funktionieren.


Vielleicht, vielleicht auch nicht. Mein Verständnis vom bisherigen Thread ist der folgende:
1. Der TE möchte über eine Gui Werte in eine Datenbank eingeben. Dabei kommt es zu einer Fehlermeldung, deren Ursache bisher offenbar noch nicht richtig verstanden wurde. Was mir gerade auffällt: der Ansatz des TE kann wie ganz oben programmiert, nicht funktionieren, weil die JTextFields ausgelesen und für ein SQL statement verwurstet werden, bevor der Benutzer überhaupt die Chance gehabt hat, eine Eingabe zu tätigen, bzw. die JTextFields werden offenbar gar nicht in die Gui eingebaut. Das hat aber offenbar nichts mit der Fehlermeldung zu tun.
2. Der TE wollte wegen der (nicht ganz verstandenen) Fehlermeldung in Zusammenhang mit der Gui auf die Dateneingabe per Konsole umsteigen, weiss aber nicht, wie das technisch geht. Hier sind wir offenbar noch gar nicht bis zu dem Punkt gekommen, wo es Programmierfehler geben kann, weil das ganze von der grundsätzlichen Vorgehensweise her unklar ist (Tip: Stichwort ist Scanner(System.in)).


----------



## Feras (11. Nov 2015)

Also, mein Programm funktioniert mittlerweile wirklich. Hier nochmal der vollständige Code dazu:

```
import java.sql.*;
import java.util.Scanner;

import javax.swing.table.DefaultTableModel;

public class SQLiteJDBC     {
  
   private static Scanner input = new Scanner(System.in);
  
   public static void ausgabeTabelle()   {
    
     Connection c = null;
    Statement stmt = null;
    try {
    Class.forName("org.sqlite.JDBC");
    c = DriverManager.getConnection("jdbc:sqlite:test.db");
    c.setAutoCommit(false);
    System.out.println("Opened database successfully");
    
    stmt = c.createStatement();

    String sql = "INSERT INTO STUDIUM(SEMESTER, NAME, AGE, STUDIENGANG, ABSCHLUSSART)" +
               "VALUES (1, 'Marcus Endler', 21, 'Wirtschaftsinformatik', 'Diplom');";
    
    stmt.executeUpdate(sql);
    
    c.commit();
    ResultSet rs = stmt.executeQuery( "SELECT * FROM STUDIUM;" );

    while ( rs.next() ) {
        
        int semester = rs.getInt("semester");
        String  name = rs.getString("name");
        int age  = rs.getInt("age");
        String  studiengang = rs.getString("studiengang");
        String abschlussart = rs.getString("abschlussart");
        System.out.println(semester);
        System.out.println(name);
        System.out.println(age);
        System.out.println(studiengang);
        System.out.println(abschlussart);
        System.out.println("\n");
  

    }
    rs.close();
    stmt.close();
    c.close();
    } catch ( Exception e ) {
    System.err.println( e.getClass().getName() + ": " + e.getMessage() );
    System.exit(0);
    }
    System.out.println("Operation done successfully");
   }

   public static void createTable() {
    
     Connection c = null;
    Statement stmt = null;
    
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
      
      stmt = c.createStatement();

      String sql = "CREATE TABLE COMPANY " +
    "(ID INT PRIMARY KEY  NOT NULL," +
    " NAME  TEXT  NOT NULL, " +
    " AGE  INT  NOT NULL, " +
    " ADDRESS  CHAR(50), " +
    " SALARY  REAL)";
      
      stmt.executeUpdate(sql);
      
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
    
   }
  
   public static void löschenDaten() {

     Connection c = null;
    Statement stmt = null;
    
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
      
      stmt = c.createStatement();

      String sql = "DROP TABLE SEMESTER";
      
      stmt.executeUpdate(sql);
      
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
    
   }

   public static void löschenTabelle() throws SQLException {

     Connection c = null;
    Statement stmt = null;
    
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
      
      stmt = c.createStatement();

      String sql = "DROP TABLE COMPANY";
      
      stmt.executeUpdate(sql);
      
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
    
   }

   public static void update() {

     Connection c = null;
    Statement stmt = null;
    
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
      
      stmt = c.createStatement();

      String sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;";
      
      stmt.executeUpdate(sql);
      
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
    
   }

   public static void hinzufügen() {

     Connection c = null;
    Statement stmt = null;
    
     try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
      
      stmt = c.createStatement();

      String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (1, 'Paul', 32, 'California', 20000.00 );";
    stmt.executeUpdate(sql);

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );";
    stmt.executeUpdate(sql);

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );";
    stmt.executeUpdate(sql);

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
    "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
    stmt.executeUpdate(sql);
      
      c.commit();

      stmt.close();
      c.close();
      } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
      }
      System.out.println("Operation done successfully");
    
   }
  
  public static void main( String args[] ) throws SQLException     {
    
   Boolean auswahl = false; 
  
   Scanner input = new Scanner(System.in);
   System.out.println("Wenn Sie eine Tabelle erstellen möchten, drucken Sie die 1.");
   System.out.println("Wenn Sie Daten hinzufügen möchten, drücken Sie die 2");
   System.out.println("Wenn Sie Daten löschen möchten, drücken Sie die 3");
   System.out.println("Wenn Sie Daten aktualisieren möchten, drücken Sie die 4");
   System.out.println("Wenn Sie die Tabelle löschen möchten, drücken Sie die 5");
   int decision = input.nextInt();
  
  switch (decision) {
  case 1:  createTable();
       auswahl = true;
  break;
  case 2: hinzufügen();
       auswahl = true;
       break;
  case 3:  löschenDaten();
       auswahl = true;
  break;
  case 4:  update();
  auswahl = true;
  break;
  case 5:  löschenTabelle();
  auswahl = true;
  break;
  default: System.out.println("Unzulässige Eingabe!\n");
  break;
  
  
  }
  
  if(auswahl == true)   {
    
     ausgabeTabelle();
  }
  
  else {
    
     main(args);
  }
  
  }

}
```
Da der Code nur vorgegebene Daten zum Erstellen der Tabelle und so weiter verwendet, wollte ich nun dazu übergehen, eigene Daten einlesen zu könne. Da soll vorsichtshalber auch erst mal über die Konsole geschehen. Ich weiß blos eben nicht, wie man das bewerkstelligen könnte, da ich ja nicht einfach einen String mit Daten einlesen kann...


----------



## Joose (11. Nov 2015)

Feras hat gesagt.:


> Ich weiß blos eben nicht, wie man das bewerkstelligen könnte, da ich ja nicht einfach einen String mit Daten einlesen kann...



Natürlich kannst du Strings von der Konsole lesen: http://stackoverflow.com/questions/4644415/java-how-to-get-input-from-system-console
Schreib dir einfach eine kleine Methode welche dir die eingelesenen Daten liefert.


```
public static String getDataFromConsole(String text) {
    System.out.println(text);
    // Code zum einlesen eines string von der konsole -> siehe link oben
    return readValue; // eingelesenen Wert zurückliefern
}

.......
// Kann nun wie folgt verwendet werden
String companyName = getDataFromConsole("Geben Sie einen Company Namen ein:");
```


----------



## Harry Kane (11. Nov 2015)

Feras hat gesagt.:


> Ich weiß blos eben nicht, wie man das bewerkstelligen könnte, da ich ja nicht einfach einen String mit Daten einlesen kann...


In deiner main-Methode liest du mithilfe eines Scanners immerhin schon einen int ein. Schau doch einfach die API Dokumentation zum Scanner an: Link


----------



## JStein52 (11. Nov 2015)

Und dann liest du entweder ein Feld eines Datensatzes nach dem anderen ein, machst daraus ein richtiges SQL-Statement und den Rest hast du ja schon. Oder du liest alle Felder eines Datensatzes z.B. mit Komma getrennt als einen einzigen String ein, zerlegst diesen in einzelne Felder und erzeugst wieder ein SQL-Statement. Und es wurde dir auch schon empfohlen dir Prepared Statement anzuschauen.


----------



## Feras (18. Nov 2015)

Ich habe jetzt versucht, eigene Daten mit einem BufferedReader einzulesen. Das Problem ist jedoch, dass ich beim folgenden Code die Fehlermeldung: "java.sql.SQLException: near "+": syntax error" erhalten. Ich schätze mal damit ist ein "+" beim Create Table Befehl gemeint. Ich sehe ihn jedoch nicht...


```
public static void createTable() throws IOException {
      
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
      
      
        Connection c = null;
       Statement stmt = null;
       int zeilenAnzahl = 1;
      
       System.out.println("Wie viele Zeilen soll Ihre Tabelle haben?");
       zeilenAnzahl = input.nextInt();
      
       System.out.println("Geben Sie bitte den 1. Zeilenname und mit einen Leerzeichen getrennt den Datentyp ein:");
       String zeile1 = br.readLine();
       System.out.println("Geben Sie bitte den 2. Zeilenname und mit einen Leerzeichen getrennt den Datentyp ein:");
       String zeile2 = br.readLine();
       System.out.println("Geben Sie bitte den 3. Zeilenname und mit einen Leerzeichen getrennt den Datentyp ein:");
       String zeile3 = br.readLine();
       System.out.println("Geben Sie bitte den 4. Zeilenname und mit einen Leerzeichen getrennt den Datentyp ein:");
       String zeile4 = br.readLine();
       System.out.println("Geben Sie bitte den 5. Zeilenname und mit einen Leerzeichen getrennt den Datentyp ein:");
       String zeile5 = br.readLine();
      
        try {
             Class.forName("org.sqlite.JDBC");
             c = DriverManager.getConnection("jdbc:sqlite:test.db");
             c.setAutoCommit(false);
             System.out.println("Opened database successfully");
            
             stmt = c.createStatement();

             String sql = "CREATE TABLE COMPANY " +
                      "(+zeile1+," +
                      " +zeile2+, " +
                      " +zeile3+, " +
                      " +zeile4+, " +
                      " +zeile5+)";
            
             stmt.executeUpdate(sql);
            
             c.commit();

             stmt.close();
             c.close();
           } catch ( Exception e ) {
             System.err.println( e.getClass().getName() + ": " + e.getMessage() );
             System.exit(0);
           }
           System.out.println("Operation done successfully");
      
    }
  
    public static void löschenDaten() {

        Connection c = null;
       Statement stmt = null;
      
        try {
             Class.forName("org.sqlite.JDBC");
             c = DriverManager.getConnection("jdbc:sqlite:test.db");
             c.setAutoCommit(false);
             System.out.println("Opened database successfully");
            
             stmt = c.createStatement();

             String sql = "DROP TABLE SEMESTER";
            
             stmt.executeUpdate(sql);
            
             c.commit();

             stmt.close();
             c.close();
           } catch ( Exception e ) {
             System.err.println( e.getClass().getName() + ": " + e.getMessage() );
             System.exit(0);
           }
           System.out.println("Operation done successfully");
      
    }
```


----------



## Thallius (18. Nov 2015)

Spaltenname und Typ werden beim create nicht mit Komma getrennt


----------



## Feras (18. Nov 2015)

Thallius hat gesagt.:


> Spaltenname und Typ werden beim create nicht mit Komma getrennt



Wenn ich die Kommas entferne sieht das ja so aus:


```
String sql = "CREATE TABLE COMPANY " +
                      "(+zeile1+" +
                      " +zeile2+ " +
                      " +zeile3+ " +
                      " +zeile4+ " +
                      " +zeile5+)";
```

Leider bleibt der Fehler bestehen :/


----------



## Thallius (18. Nov 2015)

Du gibst die falschen Kommas bereits bei deiner Readline Eingabe ein

Mach doch einfach mal eine Ausgabe von deinem query String, dann siehst du sofort den Fehler


----------



## Feras (18. Nov 2015)

Hm, ich verstehe jetzt nicht genau, was du meinst ^^


----------



## Thallius (18. Nov 2015)

Dann gibt den query aus... Ist doch nicht so schwrr


----------



## Harry Kane (18. Nov 2015)

1. Du liest einen int zeilenAnzahl ein, den du gar nicht verwendest.
2. Du verwendest NICHT die Strings, die der Benutzer eingegeben hat, sondern die Stringliterale "+zeile1" usw. Daran ist nicht nur das Plus syntaktisch falsch, sondern der Rest ist auch Käse.
Ersetze mal deine zeilen des Typs

```
"(+zeile1+" +
" +zeile2+ " +
```
durch sowas

```
"(" + zeile1 +
", " + zeile2 +
```

Ganz ehrlich: Das sind absolute basics.
Wie Thallius schon gesagt hat: Lass dir den SQL String vor dem Absenden sysouten, dann sollest du sofort sehen was Sache ist.
3. Deine String variablen heissen zwar "zeile", was du damit aber offensichtlich zu lesen beabsichtigst, sind Spaltendefintionen der Company-Tabelle. Sehr irreführende Benennung.


----------

