SQLite java.sql.SQLException: no such column:

ve987

Aktives Mitglied
Hallo,

ich habe ein Problem mit einer Abfrage und bekomme eine java.sql.SQLException.


Ich bekomme die Fehlermeldung:

Java:
SELECT Id FROM Users WHERE Name = 'Helga' // Sysout vom Befehl

2|java.sql.SQLException: no such column: 'Name'
    at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:54)
    at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:448)
    at Application.DBStatement.showData(DBStatement.java:137)
    at Application.DBStatement.createQuery(DBStatement.java:121)
    at Application.DBStatement.search(DBStatement.java:179)
    at Main.MainClass.main(MainClass.java:61)


Vermutlich vermisse ich etwas im Select Befehl?

Anbei mein Code:

Java:
private final String TABLE_NAME = "Users";
    
    private final String COLUMN_ID = "Id";
    private final String COLUMN_Name = "Name";
    private final String COLUMN_EMail = "EMail";
    private final String COLUMN_Registration_Date = "Registration"; 
    

public void createTable() throws SQLException {
        
        String createTable= "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + 
                "( " 
                 + COLUMN_ID + " INTEGER PRIMARY KEY, "
                 + COLUMN_Name + " TEXT NOT NULL, "
                 + COLUMN_EMail + " TEXT NOT NULL, "
                 + COLUMN_Registration_Date + " TEXT NOT NULL "
                
                + " )";     
    }


        public void insertData() throws SQLException {
            
    String insertData = "INSERT INTO " + TABLE_NAME + " VALUES " 
        
     + "(NULL, 'Olga', 'olga@mail.com', DATETIME('now', 'localtime')),"
     + "(NULL, 'Helga', 'helga.email.com', DATETIME('now', 'localtime')),"
     + "(NULL, 'Zoe', 'zoe.mail.com', DATETIME('now', 'localtime'))";
    
}

try {                                                                 
            dbStatement.search(1, "Helga");   //  DER BLOCK BEFINDET SICH IN SEPERATER KLASSE
        } catch (Exception e) {
            e.printStackTrace();
        }


public void search(int number, String searchText) throws SQLException {
        
        String searchQuery= "";
        
        switch (number) {

        case 1:

            searchQuery = "SELECT " + COLUMN_ID + " FROM " + TABLE_NAME + " WHERE " + COLUMN_Name + " = " + "'" + searchText + "'";   // GEHT NICHT
            
           //searchQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_Name + " = " + "'" + searchText + "'";   // DAS GEHT
            
        break;
        
        default:
            break;
        }           
    }
 
Die Fehlermeldung besagt, dass die Spalte Name nicht in der Tabelle existiert.

Das, was ich so gesehen habe, sieht aber erst einmal von der Funktion ok aus. Daher kann man nur Vermutungen anstellen. Evtl. wird immer die gleiche Datenbank-Datei genutzt und die Tabelle existiert schon ohne eine Spalte Name. Wegen dem CREATE IF NOT EXISTS läuft da aber dann alles durch ohne dass es angelegt wird ...

Generell der Hinweis: Statt SQL Queries so als String zusammen zu setzen, sollte man ein prepared statement nutzen und da dann parameter verwenden. Sonst ist man offen für SQL Injection Angriffe.
 
PHP:
<?php

     $myPDO = new PDO('sqlite:/home/legacy/Bilder/CardDatabse.db');
  
// erwarteter Parameter
     $search="Draco";
     // schlechter parameter
     $injection="asdf' OR '1'='1";
     $sql = "SELECT * FROM CreatureCards WHERE name='$injection'";
     $result = $myPDO->query($sql);
  
    print_r($result);
  
    foreach($result as $row)
    {
      print_r($row);
    }


?>

ein Php beispiel warum es nicht so nicer dicer ist strings auszuführen
die Parameter kommen von irgendwo her also client seite das kannst du auch ummodeln in java code hab keine java injection parat


ausserdem kannst du deien batch dann nicht wirklich ausnutzen die du übrignes auch nutzen solltest
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank für die Tipps. Zu java injection und prepared statement bin ich noch nicht gekommen 😉 Vorerst wollte ich mal so versuchen. Ich hoffe, es wird dann besser mit prepared statement funktionieren 🙂
 
Ich habe jetzt den Befehl direkt in die DB Browser eingefügt und Ausführung wurde ohne Fehler beendet..

SQL:
 SELECT Id FROM Users WHERE Name = 'Helga';
 
Dann lass Dir doch einmal genau ausgeben, was er ausführen will. Also den zusammengebauten String auch noch einmal zur Kontrolle ausgeben ehe Du ihn ausführst. Und zeige uns den ganzen Code, den Du da ausführst und keine zusammengeschnittenen Ausschnitte...
 
du kannst dir im Regelfall den Query String out println lassen der dann an den server übergeben wird der wäre nützlcih 😀
 
Problem gelöst 🙂 es lag an einer Methode. Ich habe COLUMN_Name, COLUMN_EMail und COLUMN_Registration_Date auskomentiert und es hat funktioniert.

Kneitzel: Du hast völlig Recht, ab jetzt werde ich immer den vollständigen Code reinkopieren.
Mart: Das hab ich auch gemacht, trotzdem danke 🙂

Java:
    private void showData(ResultSet resultSet) throws SQLException {
       
        while (resultSet.next()) {
            System.out.print(resultSet.getInt(COLUMN_ID));
            System.out.print("|");
//            System.out.print(resultSet.getString(COLUMN_Name));
//            System.out.print("|");
//            System.out.print(resultSet.getString(COLUMN_EMail));
//            System.out.print("|");
//            System.out.print(resultSet.getString(COLUMN_Registration_Date));
//            System.out.print("\n");
        }
    }
 
Das ist j auch logisch, denn Du hast ja nur die ID abgefragt in dem SQL. Daher dann bei der Abfrage des Namens im ResultSet diese Fehlermeldung.

Da dann noch der Hinweis: Wenn Du so eine Exception bekommst, dann gib auch immer den Stacktrace aus. Der zeigt genau an, in welcher Zeile der Fehler aufgetreten ist und du landest dann auch direkt an der richtigen Stelle die Du uns dann z.B. auch zeigen kannst.
 
Küchengerät ist ja wohl leicht untertrieben. Das ist die Universalmaschine. Man legt z. B. oben einen Apfel rein, unten kommt ein Ipad raus.
 
Und wenn du sofort kaufst bekommst du nicht ein sondern gleich 100 dieser tollen Geräte!

Oder wie?

Aber ich schaue sowas nicht und ich kenne dieses Gerät auch nicht ... aber so ein Handgerät zum schnellen zerkleinern habe ich auch ... immer die Küchenmaschine anwerfen ist blöd wenn man schnell Karottensticks will oder Käse Schreddern oder so ....

Und nur die Reibe ist doof - da gibt es zu leicht auch Fleischbeilage oder so 🙂

Und wenn ihr Zeit für so Werbesendungen habt, dann verbringt ihr zu wenig Zeit hier im Forum 🙂
 

Neue Themen


Zurück
Oben