Java SQLite Error

Feras

Aktives Mitglied
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?

Java:
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");
  }
}
 
Zuletzt bearbeitet von einem Moderator:
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.
 
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:

Java:
  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.

Java:
  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");
  
   }
 
Zuletzt bearbeitet von einem Moderator:
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
 
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

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.
 
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
 
Bevor wir hier vom eigentlichen Thema abdriften: in welcher Zeile aus deinem ersten Beitrag fliegt der Fehler?
Mir kommt das hier verdächtig vor:
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?
 
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.
 
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)).
 
Also, mein Programm funktioniert mittlerweile wirklich. Hier nochmal der vollständige Code dazu:
Java:
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...
 
Zuletzt bearbeitet von einem Moderator:
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.

Java:
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:");
 
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.
 
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...

Java:
    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");
      
    }
 
Zuletzt bearbeitet von einem Moderator:
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
 
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
Java:
"(+zeile1+" +
" +zeile2+ " +
durch sowas
Java:
"(" + 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.
 

Neue Themen


Zurück
Oben